claude-mpm 4.1.26__py3-none-any.whl → 4.24.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +420 -158
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/OUTPUT_STYLE.md +299 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/agent_loader.py +40 -10
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent_loader.py +11 -9
- claude_mpm/agents/frontmatter_validator.py +291 -251
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +7 -4
- claude_mpm/agents/templates/{agentic_coder_optimizer.json → agentic-coder-optimizer.json} +33 -7
- claude_mpm/agents/templates/api_qa.json +16 -4
- claude_mpm/agents/templates/circuit_breakers.md +638 -0
- claude_mpm/agents/templates/clerk-ops.json +235 -0
- claude_mpm/agents/templates/code_analyzer.json +10 -4
- claude_mpm/agents/templates/content-agent.json +358 -0
- claude_mpm/agents/templates/dart_engineer.json +307 -0
- claude_mpm/agents/templates/data_engineer.json +87 -14
- claude_mpm/agents/templates/documentation.json +76 -13
- claude_mpm/agents/templates/engineer.json +43 -9
- claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
- claude_mpm/agents/templates/git_file_tracking.md +584 -0
- claude_mpm/agents/templates/golang_engineer.json +270 -0
- claude_mpm/agents/templates/imagemagick.json +5 -2
- claude_mpm/agents/templates/java_engineer.json +346 -0
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/local_ops_agent.json +1840 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
- claude_mpm/agents/templates/memory_manager.json +6 -3
- claude_mpm/agents/templates/nextjs_engineer.json +285 -0
- claude_mpm/agents/templates/ops.json +14 -4
- claude_mpm/agents/templates/php-engineer.json +287 -0
- claude_mpm/agents/templates/pm_examples.md +474 -0
- claude_mpm/agents/templates/pm_red_flags.md +262 -0
- claude_mpm/agents/templates/product_owner.json +338 -0
- claude_mpm/agents/templates/project_organizer.json +19 -5
- claude_mpm/agents/templates/prompt-engineer.json +737 -0
- claude_mpm/agents/templates/python_engineer.json +387 -0
- claude_mpm/agents/templates/qa.json +25 -5
- claude_mpm/agents/templates/react_engineer.json +239 -0
- claude_mpm/agents/templates/refactoring_engineer.json +15 -5
- claude_mpm/agents/templates/research.json +46 -21
- claude_mpm/agents/templates/response_format.md +583 -0
- claude_mpm/agents/templates/ruby-engineer.json +280 -0
- claude_mpm/agents/templates/rust_engineer.json +275 -0
- claude_mpm/agents/templates/security.json +59 -10
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +16 -7
- claude_mpm/agents/templates/typescript_engineer.json +285 -0
- claude_mpm/agents/templates/validation_templates.md +312 -0
- claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
- claude_mpm/agents/templates/version_control.json +16 -4
- claude_mpm/agents/templates/web_qa.json +167 -21
- claude_mpm/agents/templates/web_ui.json +18 -5
- claude_mpm/cli/__init__.py +38 -378
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +722 -150
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +10 -6
- claude_mpm/cli/commands/analyze.py +15 -10
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +570 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +469 -1064
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +167 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +50 -52
- claude_mpm/cli/commands/debug.py +7 -7
- claude_mpm/cli/commands/doctor.py +43 -7
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +537 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +160 -70
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +525 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +114 -4
- claude_mpm/cli/commands/run.py +169 -42
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skills.py +488 -0
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +204 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +962 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agents_parser.py +116 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +143 -3
- claude_mpm/cli/parsers/configure_parser.py +11 -15
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +562 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +53 -2
- claude_mpm/commands/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +118 -8
- claude_mpm/commands/mpm-auto-configure.md +269 -0
- claude_mpm/commands/mpm-config.md +137 -14
- claude_mpm/commands/mpm-help.md +285 -5
- claude_mpm/commands/mpm-init.md +374 -15
- claude_mpm/commands/mpm-monitor.md +409 -0
- claude_mpm/commands/mpm-organize.md +295 -0
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-status.md +71 -9
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +2 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +15 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +19 -8
- claude_mpm/core/config.py +85 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +65 -0
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +38 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +288 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +223 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +321 -1631
- claude_mpm/core/hook_manager.py +8 -6
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +55 -8
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +92 -23
- claude_mpm/core/logger.py +19 -14
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +51 -7
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +18 -12
- claude_mpm/core/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +115 -11
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/analysis_runner.py +4 -4
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
- claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
- claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
- claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
- claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
- claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
- claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
- claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
- claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
- claude_mpm/dashboard/static/built/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/code-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
- claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
- claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/built/connection-manager.js +536 -0
- claude_mpm/dashboard/static/built/dashboard.js +1 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/built/react/events.js +30 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
- claude_mpm/dashboard/static/built/shared/logger.js +385 -0
- claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/built/socket-client.js +1 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/css/dashboard.css +588 -6
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/react/events.js +30 -0
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/events.html +607 -0
- claude_mpm/dashboard/static/index.html +635 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
- claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
- claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +26 -0
- claude_mpm/dashboard/static/js/components/session-manager.js +7 -7
- claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +455 -23
- claude_mpm/dashboard/static/js/components/working-directory.js +44 -9
- claude_mpm/dashboard/static/js/dashboard.js +245 -132
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/js/shared/logger.js +385 -0
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/js/socket-client.js +49 -22
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/legacy/activity.html +736 -0
- claude_mpm/dashboard/static/legacy/agents.html +786 -0
- claude_mpm/dashboard/static/legacy/files.html +747 -0
- claude_mpm/dashboard/static/legacy/tools.html +831 -0
- claude_mpm/dashboard/static/monitors.html +431 -0
- claude_mpm/dashboard/static/production/events.html +659 -0
- claude_mpm/dashboard/static/production/main.html +698 -0
- claude_mpm/dashboard/static/production/monitors.html +483 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
- claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
- claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
- claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +112 -109
- claude_mpm/experimental/cli_enhancements.py +4 -2
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
- claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
- claude_mpm/hooks/claude_hooks/installer.py +67 -22
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +60 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +183 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +33 -7
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +159 -512
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +13 -11
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
- claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +715 -47
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
- claude_mpm/services/agents/local_template_manager.py +744 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +6 -4
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- claude_mpm/services/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +5 -0
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +3 -1
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +13 -10
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +9 -7
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces/__init__.py +90 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +172 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +79 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +36 -14
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +4 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +8 -4
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +165 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +430 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1612 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +729 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +671 -0
- claude_mpm/services/monitor/daemon_manager.py +963 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +2 -2
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +5 -5
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +4 -4
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +553 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/metrics_collector.py +4 -4
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +581 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +7 -5
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +10 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
- claude_mpm/services/socketio/handlers/connection.py +21 -40
- claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +8 -8
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +2 -2
- claude_mpm/services/socketio/server/core.py +141 -4
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +23 -21
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +2 -2
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +470 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +8 -4
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +348 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/tools/__main__.py +1 -1
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +6 -6
- claude_mpm/tools/code_tree_events.py +14 -10
- claude_mpm/tools/socketio_debug.py +11 -11
- claude_mpm/utils/agent_dependency_loader.py +108 -27
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +2 -2
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/robust_installer.py +133 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-4.24.0.dist-info/METADATA +675 -0
- claude_mpm-4.24.0.dist-info/RECORD +1018 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/cli/commands/configure_tui.py +0 -1927
- claude_mpm/cli/commands/mpm_init.py +0 -594
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -423
- claude_mpm/services/cli/socketio_manager.py +0 -537
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm/tools/code_tree_analyzer.py +0 -1693
- claude_mpm-4.1.26.dist-info/METADATA +0 -332
- claude_mpm-4.1.26.dist-info/RECORD +0 -606
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
|
@@ -71,7 +71,7 @@ class AgentConfigurationManager:
|
|
|
71
71
|
# Cache the result
|
|
72
72
|
self._base_agent_cache = (base_agent_data, base_agent_version)
|
|
73
73
|
|
|
74
|
-
self.logger.
|
|
74
|
+
self.logger.debug(f"Loaded base agent from {self.base_agent_path}")
|
|
75
75
|
return self._base_agent_cache
|
|
76
76
|
|
|
77
77
|
except Exception as e:
|
|
@@ -369,12 +369,18 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
369
369
|
else "single"
|
|
370
370
|
)
|
|
371
371
|
|
|
372
|
+
# When using multi-source deployment, we've already determined which
|
|
373
|
+
# agents need updates. Don't re-check versions in single_agent_deployer.
|
|
374
|
+
# This prevents the issue where multi-source says "deploying 9 agents"
|
|
375
|
+
# but then all get skipped due to redundant version checks.
|
|
376
|
+
skip_version_check = use_multi_source and not force_rebuild
|
|
377
|
+
|
|
372
378
|
self.single_agent_deployer.deploy_single_agent(
|
|
373
379
|
template_file=template_file_path,
|
|
374
380
|
agents_dir=agents_dir,
|
|
375
381
|
base_agent_data=base_agent_data,
|
|
376
382
|
base_agent_version=base_agent_version,
|
|
377
|
-
force_rebuild=force_rebuild,
|
|
383
|
+
force_rebuild=force_rebuild or skip_version_check,
|
|
378
384
|
deployment_mode=deployment_mode,
|
|
379
385
|
results=results,
|
|
380
386
|
source_info=source_info,
|
|
@@ -683,7 +689,10 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
683
689
|
|
|
684
690
|
def _get_filtered_templates(self, excluded_agents: list, config: Config) -> list:
|
|
685
691
|
"""Get and filter template files based on exclusion rules."""
|
|
686
|
-
|
|
692
|
+
filter_non_mpm = config.get("agent_deployment.filter_non_mpm_agents", True)
|
|
693
|
+
return self.discovery_service.get_filtered_templates(
|
|
694
|
+
excluded_agents, config, filter_non_mpm
|
|
695
|
+
)
|
|
687
696
|
|
|
688
697
|
def _validate_and_repair_existing_agents(self, agents_dir: Path) -> Dict[str, Any]:
|
|
689
698
|
"""Validate and repair broken frontmatter in existing agent files."""
|
|
@@ -773,16 +782,6 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
773
782
|
agent_sources=agent_sources,
|
|
774
783
|
)
|
|
775
784
|
|
|
776
|
-
# Log version upgrades and source changes
|
|
777
|
-
if comparison_results.get("version_upgrades"):
|
|
778
|
-
self.logger.info(
|
|
779
|
-
f"Version upgrades available for {len(comparison_results['version_upgrades'])} agents"
|
|
780
|
-
)
|
|
781
|
-
if comparison_results.get("source_changes"):
|
|
782
|
-
self.logger.info(
|
|
783
|
-
f"Source changes for {len(comparison_results['source_changes'])} agents"
|
|
784
|
-
)
|
|
785
|
-
|
|
786
785
|
# Filter agents based on comparison results (unless force_rebuild is set)
|
|
787
786
|
if not force_rebuild:
|
|
788
787
|
# Only deploy agents that need updates or are new
|
|
@@ -801,11 +800,35 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
801
800
|
for name, path in agents_to_deploy.items()
|
|
802
801
|
if name in agents_needing_update
|
|
803
802
|
}
|
|
803
|
+
|
|
804
|
+
# Only log upgrade messages if we're actually going to deploy them
|
|
805
|
+
if filtered_agents and comparison_results.get("version_upgrades"):
|
|
806
|
+
# Filter upgrades to only those actually being deployed
|
|
807
|
+
deployed_upgrades = [
|
|
808
|
+
upgrade
|
|
809
|
+
for upgrade in comparison_results["version_upgrades"]
|
|
810
|
+
if upgrade["name"] in filtered_agents
|
|
811
|
+
]
|
|
812
|
+
|
|
813
|
+
if deployed_upgrades:
|
|
814
|
+
self.logger.info(
|
|
815
|
+
f"Deploying {len(deployed_upgrades)} agent upgrade(s):"
|
|
816
|
+
)
|
|
817
|
+
for upgrade in deployed_upgrades:
|
|
818
|
+
self.logger.info(
|
|
819
|
+
f" Upgrading: {upgrade['name']} "
|
|
820
|
+
f"{upgrade['deployed_version']} -> {upgrade['new_version']} "
|
|
821
|
+
f"(from {upgrade['source']})"
|
|
822
|
+
)
|
|
823
|
+
|
|
804
824
|
agents_to_deploy = filtered_agents
|
|
805
825
|
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
826
|
+
# Don't log this redundant message - we already logged the upgrades above
|
|
827
|
+
# The "Deploying X agent upgrade(s)" message is sufficient
|
|
828
|
+
if not agents_to_deploy:
|
|
829
|
+
self.logger.debug(
|
|
830
|
+
f"All {len(comparison_results.get('up_to_date', []))} agents are up to date"
|
|
831
|
+
)
|
|
809
832
|
|
|
810
833
|
# Convert to list of Path objects
|
|
811
834
|
template_files = list(agents_to_deploy.values())
|
|
@@ -85,7 +85,10 @@ class AgentDiscoveryService:
|
|
|
85
85
|
return agents
|
|
86
86
|
|
|
87
87
|
def get_filtered_templates(
|
|
88
|
-
self,
|
|
88
|
+
self,
|
|
89
|
+
excluded_agents: List[str],
|
|
90
|
+
config: Optional[Config] = None,
|
|
91
|
+
filter_non_mpm: bool = False,
|
|
89
92
|
) -> List[Path]:
|
|
90
93
|
"""
|
|
91
94
|
Get filtered list of template files based on configuration.
|
|
@@ -93,6 +96,7 @@ class AgentDiscoveryService:
|
|
|
93
96
|
Args:
|
|
94
97
|
excluded_agents: List of agent names to exclude
|
|
95
98
|
config: Configuration object for additional filtering
|
|
99
|
+
filter_non_mpm: Whether to filter out non-MPM agents
|
|
96
100
|
|
|
97
101
|
Returns:
|
|
98
102
|
List of template file paths to deploy
|
|
@@ -111,6 +115,7 @@ class AgentDiscoveryService:
|
|
|
111
115
|
# Apply exclusion filtering
|
|
112
116
|
filtered_files = []
|
|
113
117
|
excluded_count = 0
|
|
118
|
+
non_mpm_count = 0
|
|
114
119
|
|
|
115
120
|
for template_file in template_files:
|
|
116
121
|
agent_name = template_file.stem
|
|
@@ -121,14 +126,24 @@ class AgentDiscoveryService:
|
|
|
121
126
|
self.logger.debug(f"Excluding agent: {agent_name}")
|
|
122
127
|
continue
|
|
123
128
|
|
|
129
|
+
# Check if we should filter non-MPM agents
|
|
130
|
+
if filter_non_mpm and not self._is_mpm_agent(template_file):
|
|
131
|
+
non_mpm_count += 1
|
|
132
|
+
self.logger.debug(f"Filtering non-MPM agent: {agent_name}")
|
|
133
|
+
continue
|
|
134
|
+
|
|
124
135
|
# Validate template file
|
|
125
136
|
if self._validate_template_file(template_file):
|
|
126
137
|
filtered_files.append(template_file)
|
|
127
138
|
else:
|
|
128
139
|
self.logger.warning(f"Invalid template file: {template_file.name}")
|
|
129
140
|
|
|
141
|
+
# Log filtering results
|
|
142
|
+
if filter_non_mpm and non_mpm_count > 0:
|
|
143
|
+
self.logger.info(f"Filtered out {non_mpm_count} non-MPM agents")
|
|
144
|
+
|
|
130
145
|
self.logger.info(
|
|
131
|
-
f"Found {len(template_files)} templates, excluded {excluded_count}, deploying {len(filtered_files)}"
|
|
146
|
+
f"Found {len(template_files)} templates, excluded {excluded_count}, filtered {non_mpm_count} non-MPM, deploying {len(filtered_files)}"
|
|
132
147
|
)
|
|
133
148
|
return filtered_files
|
|
134
149
|
|
|
@@ -201,22 +216,41 @@ class AgentDiscoveryService:
|
|
|
201
216
|
metadata = template_data.get("metadata", {})
|
|
202
217
|
capabilities = template_data.get("capabilities", {})
|
|
203
218
|
|
|
219
|
+
# Handle capabilities as either dict or list
|
|
220
|
+
if isinstance(capabilities, list):
|
|
221
|
+
# If capabilities is a list (like in php-engineer.json), treat it as capabilities list
|
|
222
|
+
tools_list = template_data.get(
|
|
223
|
+
"tools", []
|
|
224
|
+
) # Look for tools at root level
|
|
225
|
+
model_value = template_data.get("model", "sonnet")
|
|
226
|
+
else:
|
|
227
|
+
# If capabilities is a dict, extract tools and model from it
|
|
228
|
+
tools_list = capabilities.get("tools", [])
|
|
229
|
+
model_value = capabilities.get("model", "sonnet")
|
|
230
|
+
|
|
204
231
|
agent_info = {
|
|
205
232
|
"name": metadata.get("name", template_file.stem),
|
|
206
|
-
"description": metadata.get(
|
|
233
|
+
"description": metadata.get(
|
|
234
|
+
"description",
|
|
235
|
+
template_data.get("description", "No description available"),
|
|
236
|
+
),
|
|
237
|
+
"type": template_data.get(
|
|
238
|
+
"agent_type",
|
|
239
|
+
metadata.get("category", template_data.get("category", "agent")),
|
|
240
|
+
), # Extract agent type
|
|
207
241
|
"version": template_data.get(
|
|
208
242
|
"agent_version",
|
|
209
243
|
template_data.get("version", metadata.get("version", "1.0.0")),
|
|
210
244
|
),
|
|
211
|
-
"tools":
|
|
245
|
+
"tools": tools_list,
|
|
212
246
|
"specializations": metadata.get(
|
|
213
|
-
"tags", []
|
|
214
|
-
), # Use tags as specializations
|
|
247
|
+
"tags", template_data.get("tags", [])
|
|
248
|
+
), # Use tags as specializations, fallback to root-level tags
|
|
215
249
|
"file": template_file.name,
|
|
216
250
|
"path": str(template_file),
|
|
217
251
|
"file_path": str(template_file), # Keep for backward compatibility
|
|
218
252
|
"size": template_file.stat().st_size,
|
|
219
|
-
"model":
|
|
253
|
+
"model": model_value,
|
|
220
254
|
"author": metadata.get("author", "unknown"),
|
|
221
255
|
}
|
|
222
256
|
|
|
@@ -236,6 +270,46 @@ class AgentDiscoveryService:
|
|
|
236
270
|
)
|
|
237
271
|
return None
|
|
238
272
|
|
|
273
|
+
def _is_mpm_agent(self, template_file: Path) -> bool:
|
|
274
|
+
"""Check if agent is authored by Claude MPM team.
|
|
275
|
+
|
|
276
|
+
MPM agents must have:
|
|
277
|
+
- An author field containing 'claude mpm', 'claude-mpm', or 'anthropic'
|
|
278
|
+
- A valid agent_version field
|
|
279
|
+
|
|
280
|
+
Args:
|
|
281
|
+
template_file: Path to the agent template JSON file
|
|
282
|
+
|
|
283
|
+
Returns:
|
|
284
|
+
True if this is an MPM agent, False otherwise
|
|
285
|
+
"""
|
|
286
|
+
try:
|
|
287
|
+
template_data = json.loads(template_file.read_text())
|
|
288
|
+
metadata = template_data.get("metadata", {})
|
|
289
|
+
|
|
290
|
+
# Check for author field
|
|
291
|
+
author = metadata.get("author", "").lower()
|
|
292
|
+
has_valid_author = any(
|
|
293
|
+
pattern in author
|
|
294
|
+
for pattern in ["claude mpm", "claude-mpm", "anthropic"]
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
# Check for version field
|
|
298
|
+
has_version = bool(template_data.get("agent_version"))
|
|
299
|
+
|
|
300
|
+
if not has_valid_author or not has_version:
|
|
301
|
+
self.logger.debug(
|
|
302
|
+
f"Filtered non-MPM agent {template_file.name}: "
|
|
303
|
+
f"author='{metadata.get('author', 'missing')}', "
|
|
304
|
+
f"version={'present' if has_version else 'missing'}"
|
|
305
|
+
)
|
|
306
|
+
|
|
307
|
+
return has_valid_author and has_version
|
|
308
|
+
|
|
309
|
+
except Exception as e:
|
|
310
|
+
self.logger.debug(f"Error checking if {template_file} is MPM agent: {e}")
|
|
311
|
+
return False # Treat invalid templates as non-MPM
|
|
312
|
+
|
|
239
313
|
def _is_agent_excluded(
|
|
240
314
|
self,
|
|
241
315
|
agent_name: str,
|
|
@@ -357,6 +431,50 @@ class AgentDiscoveryService:
|
|
|
357
431
|
|
|
358
432
|
return bool(re.match(pattern, agent_name))
|
|
359
433
|
|
|
434
|
+
def _is_mpm_agent(
|
|
435
|
+
self, template_file: Path, config: Optional[Config] = None
|
|
436
|
+
) -> bool:
|
|
437
|
+
"""Check if agent is authored by Claude MPM team.
|
|
438
|
+
|
|
439
|
+
MPM agents must have:
|
|
440
|
+
- An author field containing configurable MPM patterns (default: 'claude mpm', 'claude-mpm', 'anthropic')
|
|
441
|
+
- A valid agent_version field
|
|
442
|
+
|
|
443
|
+
Args:
|
|
444
|
+
template_file: Path to the agent template JSON file
|
|
445
|
+
config: Configuration object for MPM patterns
|
|
446
|
+
|
|
447
|
+
Returns:
|
|
448
|
+
True if this is an MPM agent, False otherwise
|
|
449
|
+
"""
|
|
450
|
+
try:
|
|
451
|
+
template_data = json.loads(template_file.read_text())
|
|
452
|
+
metadata = template_data.get("metadata", {})
|
|
453
|
+
|
|
454
|
+
# Get MPM author patterns from config
|
|
455
|
+
if config:
|
|
456
|
+
mpm_patterns = config.get(
|
|
457
|
+
"agent_deployment.mpm_author_patterns",
|
|
458
|
+
["claude mpm", "claude-mpm", "anthropic"],
|
|
459
|
+
)
|
|
460
|
+
else:
|
|
461
|
+
mpm_patterns = ["claude mpm", "claude-mpm", "anthropic"]
|
|
462
|
+
|
|
463
|
+
# Check for author field
|
|
464
|
+
author = metadata.get("author", "").lower()
|
|
465
|
+
has_valid_author = any(
|
|
466
|
+
pattern.lower() in author for pattern in mpm_patterns
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
# Check for version field
|
|
470
|
+
has_version = bool(template_data.get("agent_version"))
|
|
471
|
+
|
|
472
|
+
return has_valid_author and has_version
|
|
473
|
+
|
|
474
|
+
except Exception as e:
|
|
475
|
+
self.logger.debug(f"Error checking if {template_file} is MPM agent: {e}")
|
|
476
|
+
return False # Treat invalid templates as non-MPM
|
|
477
|
+
|
|
360
478
|
def get_discovery_stats(self) -> Dict[str, Any]:
|
|
361
479
|
"""
|
|
362
480
|
Get statistics about agent discovery.
|
|
@@ -183,9 +183,9 @@ class AgentFileSystemManager:
|
|
|
183
183
|
try:
|
|
184
184
|
# Generate backup directory name if not provided
|
|
185
185
|
if not backup_dir:
|
|
186
|
-
import datetime
|
|
186
|
+
from datetime import datetime, timezone
|
|
187
187
|
|
|
188
|
-
timestamp = datetime.
|
|
188
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
189
189
|
backup_dir = agents_dir.parent / f"agents_backup_{timestamp}"
|
|
190
190
|
|
|
191
191
|
# Create backup
|
|
@@ -324,7 +324,7 @@ class AgentFileSystemManager:
|
|
|
324
324
|
|
|
325
325
|
def _convert_yaml_to_markdown(self, yaml_content: str, agent_name: str) -> str:
|
|
326
326
|
"""Convert YAML agent content to Markdown format with frontmatter."""
|
|
327
|
-
from datetime import datetime
|
|
327
|
+
from datetime import datetime, timezone
|
|
328
328
|
|
|
329
329
|
# Extract YAML fields (simplified parsing)
|
|
330
330
|
name = self._extract_yaml_field(yaml_content, "name") or agent_name
|
|
@@ -356,8 +356,8 @@ name: {name}
|
|
|
356
356
|
description: "{description}"
|
|
357
357
|
version: "{version}"
|
|
358
358
|
author: "claude-mpm@anthropic.com"
|
|
359
|
-
created: "{datetime.now().isoformat()}Z"
|
|
360
|
-
updated: "{datetime.now().isoformat()}Z"
|
|
359
|
+
created: "{datetime.now(timezone.utc).isoformat()}Z"
|
|
360
|
+
updated: "{datetime.now(timezone.utc).isoformat()}Z"
|
|
361
361
|
tags: ["{agent_name}", "mpm-framework"]
|
|
362
362
|
tools: {tools_list}
|
|
363
363
|
model: "sonnet"
|
|
@@ -8,7 +8,6 @@ maintainability and testability.
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import re
|
|
11
|
-
from datetime import datetime
|
|
12
11
|
from pathlib import Path
|
|
13
12
|
from typing import Any, Dict, Optional
|
|
14
13
|
|
|
@@ -130,13 +129,13 @@ class AgentFormatConverter:
|
|
|
130
129
|
if isinstance(tools_line, str):
|
|
131
130
|
if tools_line.startswith("[") and tools_line.endswith("]"):
|
|
132
131
|
# Already in list format
|
|
133
|
-
|
|
132
|
+
pass
|
|
134
133
|
else:
|
|
135
134
|
# Convert comma-separated to list
|
|
136
135
|
tools = [tool.strip() for tool in tools_line.split(",")]
|
|
137
|
-
|
|
136
|
+
str(tools).replace("'", '"')
|
|
138
137
|
else:
|
|
139
|
-
|
|
138
|
+
pass
|
|
140
139
|
|
|
141
140
|
# Extract additional fields
|
|
142
141
|
model = self.extract_yaml_field(yaml_content, "model") or "sonnet"
|
|
@@ -148,19 +147,38 @@ class AgentFormatConverter:
|
|
|
148
147
|
# Extract instructions from YAML content
|
|
149
148
|
instructions = self._extract_instructions_from_yaml(yaml_content, agent_name)
|
|
150
149
|
|
|
151
|
-
#
|
|
152
|
-
|
|
150
|
+
# Map model names to Claude Code format
|
|
151
|
+
model_map = {
|
|
152
|
+
"claude-3-5-sonnet-20241022": "sonnet",
|
|
153
|
+
"claude-3-5-sonnet": "sonnet",
|
|
154
|
+
"claude-3-sonnet": "sonnet",
|
|
155
|
+
"claude-3-haiku": "haiku",
|
|
156
|
+
"claude-3-opus": "opus",
|
|
157
|
+
"sonnet": "sonnet",
|
|
158
|
+
"haiku": "haiku",
|
|
159
|
+
"opus": "opus",
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
mapped_model = model_map.get(model, "sonnet")
|
|
163
|
+
|
|
164
|
+
# Create multiline description with example (Claude Code format)
|
|
165
|
+
multiline_description = f"""{description}
|
|
166
|
+
|
|
167
|
+
<example>
|
|
168
|
+
Context: When you need specialized assistance from the {name} agent.
|
|
169
|
+
user: "I need help with {agent_name.replace('_', ' ').replace('-', ' ')} tasks"
|
|
170
|
+
assistant: "I'll use the {name} agent to provide specialized assistance."
|
|
171
|
+
</example>"""
|
|
153
172
|
|
|
173
|
+
# Build new YAML frontmatter - Claude Code compatible format
|
|
174
|
+
# NOTE: Removed tags field and other non-essential fields for Claude Code compatibility
|
|
154
175
|
new_frontmatter = f"""---
|
|
155
176
|
name: {name}
|
|
156
|
-
description:
|
|
177
|
+
description: |
|
|
178
|
+
{self._indent_text(multiline_description, 2)}
|
|
179
|
+
model: {mapped_model}
|
|
157
180
|
version: "{version}"
|
|
158
181
|
author: "{author}"
|
|
159
|
-
created: "{current_time}"
|
|
160
|
-
updated: "{current_time}"
|
|
161
|
-
tags: ["{agent_name}", "mpm-framework"]
|
|
162
|
-
tools: {tools_list}
|
|
163
|
-
model: "{model}"
|
|
164
182
|
---
|
|
165
183
|
|
|
166
184
|
"""
|
|
@@ -447,3 +465,29 @@ model: "{model}"
|
|
|
447
465
|
except Exception as e:
|
|
448
466
|
self.logger.error(f"Failed to convert MD to JSON: {e}")
|
|
449
467
|
return json.dumps({"error": str(e)})
|
|
468
|
+
|
|
469
|
+
def _indent_text(self, text: str, spaces: int) -> str:
|
|
470
|
+
"""
|
|
471
|
+
Indent multiline text with specified number of spaces.
|
|
472
|
+
|
|
473
|
+
Args:
|
|
474
|
+
text: Text to indent
|
|
475
|
+
spaces: Number of spaces for indentation
|
|
476
|
+
|
|
477
|
+
Returns:
|
|
478
|
+
Indented text
|
|
479
|
+
"""
|
|
480
|
+
if not text:
|
|
481
|
+
return ""
|
|
482
|
+
|
|
483
|
+
indent = " " * spaces
|
|
484
|
+
lines = text.split("\n")
|
|
485
|
+
indented_lines = []
|
|
486
|
+
|
|
487
|
+
for line in lines:
|
|
488
|
+
if line.strip(): # Non-empty lines get indented
|
|
489
|
+
indented_lines.append(indent + line)
|
|
490
|
+
else: # Empty lines stay empty
|
|
491
|
+
indented_lines.append("")
|
|
492
|
+
|
|
493
|
+
return "\n".join(indented_lines)
|
|
@@ -32,10 +32,12 @@ Created for ISS-0118: Agent Registry and Hierarchical Discovery System
|
|
|
32
32
|
|
|
33
33
|
import asyncio
|
|
34
34
|
import time
|
|
35
|
+
from datetime import datetime, timezone
|
|
35
36
|
from pathlib import Path
|
|
36
37
|
from typing import Any, Dict, List, Optional
|
|
37
38
|
|
|
38
39
|
from claude_mpm.core.base_service import BaseService
|
|
40
|
+
from claude_mpm.core.unified_paths import get_path_manager
|
|
39
41
|
from claude_mpm.models.agent_definition import AgentDefinition
|
|
40
42
|
from claude_mpm.services.agents.management import AgentManager
|
|
41
43
|
from claude_mpm.services.agents.memory import (
|
|
@@ -270,7 +272,7 @@ class AgentLifecycleManager(BaseService):
|
|
|
270
272
|
# First convert to JSON string with custom encoder, then save
|
|
271
273
|
json_str = json.dumps(data, indent=2, default=str)
|
|
272
274
|
records_file.parent.mkdir(parents=True, exist_ok=True)
|
|
273
|
-
with open(
|
|
275
|
+
with records_file.open("w", encoding="utf-8") as f:
|
|
274
276
|
f.write(json_str)
|
|
275
277
|
|
|
276
278
|
self.logger.debug(f"Saved {len(self.agent_records)} agent records")
|
|
@@ -758,7 +760,7 @@ class AgentLifecycleManager(BaseService):
|
|
|
758
760
|
backup_dir = get_path_manager().get_tracking_dir() / "backups"
|
|
759
761
|
path_ops.ensure_dir(backup_dir)
|
|
760
762
|
|
|
761
|
-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
763
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
762
764
|
backup_filename = f"{agent_name}_deleted_{timestamp}{source_path.suffix}"
|
|
763
765
|
backup_path = backup_dir / backup_filename
|
|
764
766
|
|
|
@@ -479,9 +479,9 @@ class AgentOperationService(BaseService):
|
|
|
479
479
|
backup_dir = get_path_manager().get_tracking_dir() / "backups"
|
|
480
480
|
path_ops.ensure_dir(backup_dir)
|
|
481
481
|
|
|
482
|
-
from datetime import datetime
|
|
482
|
+
from datetime import datetime, timezone
|
|
483
483
|
|
|
484
|
-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
484
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
485
485
|
backup_filename = f"{agent_name}_deleted_{timestamp}{source_path.suffix}"
|
|
486
486
|
backup_path = backup_dir / backup_filename
|
|
487
487
|
|
|
@@ -80,7 +80,7 @@ class AgentRecordService(BaseService):
|
|
|
80
80
|
json_str = json.dumps(data, indent=2, default=str)
|
|
81
81
|
self.records_file.parent.mkdir(parents=True, exist_ok=True)
|
|
82
82
|
|
|
83
|
-
with
|
|
83
|
+
with self.records_file.open("w", encoding="utf-8") as f:
|
|
84
84
|
f.write(json_str)
|
|
85
85
|
|
|
86
86
|
self.logger.debug(f"Saved {len(records)} agent records")
|
|
@@ -107,7 +107,7 @@ class AgentRecordService(BaseService):
|
|
|
107
107
|
record = self._deserialize_record(record_data)
|
|
108
108
|
records[agent_name] = record
|
|
109
109
|
|
|
110
|
-
self.logger.
|
|
110
|
+
self.logger.debug(f"Loaded {len(records)} agent records")
|
|
111
111
|
else:
|
|
112
112
|
self.logger.debug("No existing records file found")
|
|
113
113
|
|
|
@@ -149,7 +149,7 @@ class AgentRecordService(BaseService):
|
|
|
149
149
|
json_str = json.dumps(data, indent=2, default=str)
|
|
150
150
|
self.history_file.parent.mkdir(parents=True, exist_ok=True)
|
|
151
151
|
|
|
152
|
-
with
|
|
152
|
+
with self.history_file.open("w", encoding="utf-8") as f:
|
|
153
153
|
f.write(json_str)
|
|
154
154
|
|
|
155
155
|
self.logger.debug(f"Saved {len(history)} operation history entries")
|
|
@@ -255,7 +255,7 @@ class AgentRecordService(BaseService):
|
|
|
255
255
|
|
|
256
256
|
# Write to output path
|
|
257
257
|
json_str = json.dumps(data, indent=2, default=str)
|
|
258
|
-
with open(
|
|
258
|
+
with output_path.open("w", encoding="utf-8") as f:
|
|
259
259
|
f.write(json_str)
|
|
260
260
|
|
|
261
261
|
elif format == "csv":
|
|
@@ -59,9 +59,9 @@ class AgentLifecycleRecord:
|
|
|
59
59
|
@property
|
|
60
60
|
def last_modified_datetime(self):
|
|
61
61
|
"""Get last modified as datetime."""
|
|
62
|
-
from datetime import datetime
|
|
62
|
+
from datetime import datetime, timezone
|
|
63
63
|
|
|
64
|
-
return datetime.fromtimestamp(self.last_modified)
|
|
64
|
+
return datetime.fromtimestamp(self.last_modified, tz=timezone.utc)
|
|
65
65
|
|
|
66
66
|
|
|
67
67
|
@dataclass
|