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
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
"""Local Template Deployment Service for Claude MPM.
|
|
2
|
+
|
|
3
|
+
This module handles the deployment of local JSON agent templates to Claude Code's
|
|
4
|
+
.claude/agents directory. It converts JSON templates to YAML format while preserving
|
|
5
|
+
local metadata and ensuring proper priority handling.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Any, Dict, List, Optional
|
|
10
|
+
|
|
11
|
+
import yaml
|
|
12
|
+
|
|
13
|
+
from claude_mpm.core.logging_config import get_logger
|
|
14
|
+
from claude_mpm.services.agents.local_template_manager import (
|
|
15
|
+
LocalAgentTemplate,
|
|
16
|
+
LocalAgentTemplateManager,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
logger = get_logger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class LocalTemplateDeploymentService:
|
|
23
|
+
"""Service for deploying local JSON templates to Claude Code."""
|
|
24
|
+
|
|
25
|
+
def __init__(self, working_directory: Optional[Path] = None):
|
|
26
|
+
"""Initialize the local template deployment service.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
working_directory: Working directory for project-level agents
|
|
30
|
+
"""
|
|
31
|
+
self.working_directory = working_directory or Path.cwd()
|
|
32
|
+
self.template_manager = LocalAgentTemplateManager(working_directory)
|
|
33
|
+
|
|
34
|
+
# Target directory for Claude Code agents
|
|
35
|
+
self.target_dir = self.working_directory / ".claude" / "agents"
|
|
36
|
+
|
|
37
|
+
logger.info(
|
|
38
|
+
f"LocalTemplateDeploymentService initialized for: {self.working_directory}"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
def deploy_local_templates(
|
|
42
|
+
self, force_rebuild: bool = False, tier_filter: Optional[str] = None
|
|
43
|
+
) -> Dict[str, Any]:
|
|
44
|
+
"""Deploy all local JSON templates to Claude Code.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
force_rebuild: Force rebuild even if agents exist
|
|
48
|
+
tier_filter: Filter by tier ('project' or 'user')
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
Deployment results dictionary
|
|
52
|
+
"""
|
|
53
|
+
results = {
|
|
54
|
+
"deployed": [],
|
|
55
|
+
"updated": [],
|
|
56
|
+
"skipped": [],
|
|
57
|
+
"errors": [],
|
|
58
|
+
"total": 0,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# Ensure target directory exists
|
|
62
|
+
self.target_dir.mkdir(parents=True, exist_ok=True)
|
|
63
|
+
|
|
64
|
+
# Discover local templates
|
|
65
|
+
templates = self.template_manager.discover_local_templates()
|
|
66
|
+
|
|
67
|
+
# Filter by tier if requested
|
|
68
|
+
if tier_filter:
|
|
69
|
+
templates = {
|
|
70
|
+
agent_id: template
|
|
71
|
+
for agent_id, template in templates.items()
|
|
72
|
+
if template.tier == tier_filter
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
results["total"] = len(templates)
|
|
76
|
+
|
|
77
|
+
# Deploy each template
|
|
78
|
+
for agent_id, template in templates.items():
|
|
79
|
+
try:
|
|
80
|
+
deployed = self._deploy_single_template(template, force_rebuild)
|
|
81
|
+
|
|
82
|
+
if deployed == "deployed":
|
|
83
|
+
results["deployed"].append(agent_id)
|
|
84
|
+
elif deployed == "updated":
|
|
85
|
+
results["updated"].append(agent_id)
|
|
86
|
+
else:
|
|
87
|
+
results["skipped"].append(agent_id)
|
|
88
|
+
|
|
89
|
+
except Exception as e:
|
|
90
|
+
logger.error(f"Failed to deploy local template {agent_id}: {e}")
|
|
91
|
+
results["errors"].append(f"{agent_id}: {e}")
|
|
92
|
+
|
|
93
|
+
logger.debug(
|
|
94
|
+
f"Local template deployment: deployed={len(results['deployed'])}, "
|
|
95
|
+
f"updated={len(results['updated'])}, skipped={len(results['skipped'])}, "
|
|
96
|
+
f"errors={len(results['errors'])}"
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
return results
|
|
100
|
+
|
|
101
|
+
def _deploy_single_template(
|
|
102
|
+
self, template: LocalAgentTemplate, force_rebuild: bool
|
|
103
|
+
) -> str:
|
|
104
|
+
"""Deploy a single local template.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
template: Template to deploy
|
|
108
|
+
force_rebuild: Force rebuild even if exists
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
'deployed', 'updated', or 'skipped'
|
|
112
|
+
"""
|
|
113
|
+
target_file = self.target_dir / f"{template.agent_id}.md"
|
|
114
|
+
|
|
115
|
+
# Check if needs update
|
|
116
|
+
if not force_rebuild and target_file.exists():
|
|
117
|
+
# Check version
|
|
118
|
+
existing_version = self._get_existing_version(target_file)
|
|
119
|
+
if existing_version and existing_version >= template.agent_version:
|
|
120
|
+
logger.debug(
|
|
121
|
+
f"Skipping {template.agent_id}: version {existing_version} >= {template.agent_version}"
|
|
122
|
+
)
|
|
123
|
+
return "skipped"
|
|
124
|
+
|
|
125
|
+
# Convert JSON template to YAML frontmatter format
|
|
126
|
+
yaml_content = self._convert_to_yaml_format(template)
|
|
127
|
+
|
|
128
|
+
# Write to target file
|
|
129
|
+
action = "updated" if target_file.exists() else "deployed"
|
|
130
|
+
target_file.write_text(yaml_content)
|
|
131
|
+
|
|
132
|
+
logger.info(
|
|
133
|
+
f"{action.capitalize()} local agent {template.agent_id} (v{template.agent_version})"
|
|
134
|
+
)
|
|
135
|
+
return action
|
|
136
|
+
|
|
137
|
+
def _convert_to_yaml_format(self, template: LocalAgentTemplate) -> str:
|
|
138
|
+
"""Convert local JSON template to YAML frontmatter format.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
template: Template to convert
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
YAML formatted agent content
|
|
145
|
+
"""
|
|
146
|
+
# Build frontmatter
|
|
147
|
+
frontmatter = {
|
|
148
|
+
"name": template.metadata.get("name", template.agent_id),
|
|
149
|
+
"description": template.metadata.get("description", ""),
|
|
150
|
+
"version": template.agent_version,
|
|
151
|
+
"author": template.author,
|
|
152
|
+
"tier": template.tier,
|
|
153
|
+
"priority": template.priority,
|
|
154
|
+
"tags": template.metadata.get("tags", ["local"]),
|
|
155
|
+
"specializations": template.metadata.get("specializations", []),
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# Add capabilities
|
|
159
|
+
if template.capabilities:
|
|
160
|
+
frontmatter["model"] = template.capabilities.get("model", "sonnet")
|
|
161
|
+
tools = template.capabilities.get("tools", "*")
|
|
162
|
+
if tools == "*":
|
|
163
|
+
frontmatter["tools"] = "all"
|
|
164
|
+
elif isinstance(tools, list):
|
|
165
|
+
frontmatter["tools"] = tools
|
|
166
|
+
else:
|
|
167
|
+
frontmatter["tools"] = tools.split(",") if "," in tools else [tools]
|
|
168
|
+
|
|
169
|
+
# Add configuration if present
|
|
170
|
+
if template.configuration:
|
|
171
|
+
frontmatter["temperature"] = template.configuration.get("temperature", 0.7)
|
|
172
|
+
frontmatter["max_tokens"] = template.configuration.get("max_tokens", 4096)
|
|
173
|
+
|
|
174
|
+
# Add parent agent reference if present
|
|
175
|
+
if template.parent_agent:
|
|
176
|
+
frontmatter["parent_agent"] = template.parent_agent
|
|
177
|
+
|
|
178
|
+
# Add local indicator
|
|
179
|
+
frontmatter["is_local"] = True
|
|
180
|
+
|
|
181
|
+
# Build YAML content
|
|
182
|
+
yaml_str = yaml.dump(frontmatter, default_flow_style=False, sort_keys=False)
|
|
183
|
+
|
|
184
|
+
# Combine with instructions
|
|
185
|
+
content = f"---\n{yaml_str}---\n\n# {frontmatter['name']}\n\n{frontmatter['description']}\n\n"
|
|
186
|
+
|
|
187
|
+
# Add instructions
|
|
188
|
+
if template.instructions:
|
|
189
|
+
content += "## Instructions\n\n"
|
|
190
|
+
content += template.instructions + "\n"
|
|
191
|
+
else:
|
|
192
|
+
content += "## Instructions\n\n"
|
|
193
|
+
content += f"This is a local {template.agent_id} agent for the {template.author} project.\n"
|
|
194
|
+
|
|
195
|
+
# Add inheritance note if applicable
|
|
196
|
+
if template.parent_agent:
|
|
197
|
+
content += f"\n## Inheritance\n\nThis agent inherits from: {template.parent_agent}\n"
|
|
198
|
+
|
|
199
|
+
return content
|
|
200
|
+
|
|
201
|
+
def _get_existing_version(self, agent_file: Path) -> Optional[str]:
|
|
202
|
+
"""Get version from existing agent file.
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
agent_file: Path to agent file
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
Version string if found, None otherwise
|
|
209
|
+
"""
|
|
210
|
+
try:
|
|
211
|
+
content = agent_file.read_text()
|
|
212
|
+
|
|
213
|
+
# Parse YAML frontmatter
|
|
214
|
+
if content.startswith("---"):
|
|
215
|
+
end_marker = content.find("---", 3)
|
|
216
|
+
if end_marker != -1:
|
|
217
|
+
frontmatter_str = content[3:end_marker].strip()
|
|
218
|
+
frontmatter = yaml.safe_load(frontmatter_str)
|
|
219
|
+
return frontmatter.get("version")
|
|
220
|
+
|
|
221
|
+
except Exception as e:
|
|
222
|
+
logger.debug(f"Could not extract version from {agent_file}: {e}")
|
|
223
|
+
|
|
224
|
+
return None
|
|
225
|
+
|
|
226
|
+
def deploy_single_local_template(
|
|
227
|
+
self, agent_id: str, force_rebuild: bool = False
|
|
228
|
+
) -> bool:
|
|
229
|
+
"""Deploy a specific local template by ID.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
agent_id: ID of agent to deploy
|
|
233
|
+
force_rebuild: Force rebuild even if exists
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
True if deployed successfully, False otherwise
|
|
237
|
+
"""
|
|
238
|
+
template = self.template_manager.get_local_template(agent_id)
|
|
239
|
+
if not template:
|
|
240
|
+
logger.error(f"Local template not found: {agent_id}")
|
|
241
|
+
return False
|
|
242
|
+
|
|
243
|
+
try:
|
|
244
|
+
result = self._deploy_single_template(template, force_rebuild)
|
|
245
|
+
return result in ["deployed", "updated"]
|
|
246
|
+
except Exception as e:
|
|
247
|
+
logger.error(f"Failed to deploy local template {agent_id}: {e}")
|
|
248
|
+
return False
|
|
249
|
+
|
|
250
|
+
def list_deployed_local_agents(self) -> List[Dict[str, Any]]:
|
|
251
|
+
"""List all deployed local agents.
|
|
252
|
+
|
|
253
|
+
Returns:
|
|
254
|
+
List of deployed local agent information
|
|
255
|
+
"""
|
|
256
|
+
deployed = []
|
|
257
|
+
|
|
258
|
+
if not self.target_dir.exists():
|
|
259
|
+
return deployed
|
|
260
|
+
|
|
261
|
+
for agent_file in self.target_dir.glob("*.md"):
|
|
262
|
+
try:
|
|
263
|
+
content = agent_file.read_text()
|
|
264
|
+
|
|
265
|
+
# Parse YAML frontmatter
|
|
266
|
+
if content.startswith("---"):
|
|
267
|
+
end_marker = content.find("---", 3)
|
|
268
|
+
if end_marker != -1:
|
|
269
|
+
frontmatter_str = content[3:end_marker].strip()
|
|
270
|
+
frontmatter = yaml.safe_load(frontmatter_str)
|
|
271
|
+
|
|
272
|
+
# Check if it's a local agent
|
|
273
|
+
if frontmatter.get("is_local") or frontmatter.get("tier") in [
|
|
274
|
+
"project",
|
|
275
|
+
"user",
|
|
276
|
+
]:
|
|
277
|
+
deployed.append(
|
|
278
|
+
{
|
|
279
|
+
"id": agent_file.stem,
|
|
280
|
+
"name": frontmatter.get("name", agent_file.stem),
|
|
281
|
+
"version": frontmatter.get("version", "unknown"),
|
|
282
|
+
"author": frontmatter.get("author", "unknown"),
|
|
283
|
+
"tier": frontmatter.get("tier", "unknown"),
|
|
284
|
+
"tags": frontmatter.get("tags", []),
|
|
285
|
+
"file": str(agent_file),
|
|
286
|
+
}
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
except Exception as e:
|
|
290
|
+
logger.debug(f"Could not parse {agent_file}: {e}")
|
|
291
|
+
|
|
292
|
+
return deployed
|
|
293
|
+
|
|
294
|
+
def clean_local_deployments(self) -> int:
|
|
295
|
+
"""Remove all deployed local agents.
|
|
296
|
+
|
|
297
|
+
Returns:
|
|
298
|
+
Number of agents removed
|
|
299
|
+
"""
|
|
300
|
+
count = 0
|
|
301
|
+
deployed = self.list_deployed_local_agents()
|
|
302
|
+
|
|
303
|
+
for agent_info in deployed:
|
|
304
|
+
try:
|
|
305
|
+
agent_file = Path(agent_info["file"])
|
|
306
|
+
if agent_file.exists():
|
|
307
|
+
agent_file.unlink()
|
|
308
|
+
count += 1
|
|
309
|
+
logger.info(f"Removed deployed local agent: {agent_info['id']}")
|
|
310
|
+
except Exception as e:
|
|
311
|
+
logger.error(f"Failed to remove {agent_info['id']}: {e}")
|
|
312
|
+
|
|
313
|
+
return count
|
|
314
|
+
|
|
315
|
+
def sync_local_templates(self) -> Dict[str, Any]:
|
|
316
|
+
"""Synchronize local templates with deployed agents.
|
|
317
|
+
|
|
318
|
+
This ensures deployed agents match their source templates.
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
Sync results dictionary
|
|
322
|
+
"""
|
|
323
|
+
results = {"updated": [], "removed": [], "added": [], "errors": []}
|
|
324
|
+
|
|
325
|
+
# Get current state
|
|
326
|
+
templates = self.template_manager.discover_local_templates()
|
|
327
|
+
deployed = {agent["id"]: agent for agent in self.list_deployed_local_agents()}
|
|
328
|
+
|
|
329
|
+
# Check for updates and additions
|
|
330
|
+
for agent_id, template in templates.items():
|
|
331
|
+
if agent_id in deployed:
|
|
332
|
+
# Check if needs update
|
|
333
|
+
if deployed[agent_id][
|
|
334
|
+
"version"
|
|
335
|
+
] != template.agent_version and self.deploy_single_local_template(
|
|
336
|
+
agent_id, force_rebuild=True
|
|
337
|
+
):
|
|
338
|
+
results["updated"].append(agent_id)
|
|
339
|
+
# New agent to deploy
|
|
340
|
+
elif self.deploy_single_local_template(agent_id):
|
|
341
|
+
results["added"].append(agent_id)
|
|
342
|
+
|
|
343
|
+
# Check for orphaned deployments (deployed but no template)
|
|
344
|
+
for agent_id in deployed:
|
|
345
|
+
if agent_id not in templates:
|
|
346
|
+
try:
|
|
347
|
+
agent_file = Path(deployed[agent_id]["file"])
|
|
348
|
+
agent_file.unlink()
|
|
349
|
+
results["removed"].append(agent_id)
|
|
350
|
+
logger.info(f"Removed orphaned local agent: {agent_id}")
|
|
351
|
+
except Exception as e:
|
|
352
|
+
logger.error(f"Failed to remove orphaned agent {agent_id}: {e}")
|
|
353
|
+
results["errors"].append(f"{agent_id}: {e}")
|
|
354
|
+
|
|
355
|
+
logger.info(
|
|
356
|
+
f"Sync complete: added={len(results['added'])}, "
|
|
357
|
+
f"updated={len(results['updated'])}, removed={len(results['removed'])}"
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
return results
|
|
@@ -176,23 +176,47 @@ class MultiSourceAgentDeploymentService:
|
|
|
176
176
|
# Log if a higher priority source was overridden by version
|
|
177
177
|
for other_agent in agent_versions:
|
|
178
178
|
if other_agent != highest_version_agent:
|
|
179
|
-
|
|
179
|
+
# Parse both versions for comparison
|
|
180
|
+
other_version = self.version_manager.parse_version(
|
|
180
181
|
other_agent.get("version", "0.0.0")
|
|
181
182
|
)
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
183
|
+
highest_version = self.version_manager.parse_version(
|
|
184
|
+
highest_version_agent.get("version", "0.0.0")
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
# Compare the versions
|
|
188
|
+
version_comparison = self.version_manager.compare_versions(
|
|
189
|
+
other_version, highest_version
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
# Only warn if the other version is actually lower
|
|
193
|
+
if version_comparison < 0:
|
|
194
|
+
if (
|
|
195
|
+
other_agent["source"] == "project"
|
|
196
|
+
and highest_version_agent["source"] == "system"
|
|
197
|
+
):
|
|
198
|
+
self.logger.warning(
|
|
199
|
+
f"Project agent '{agent_name}' v{other_agent['version']} "
|
|
200
|
+
f"overridden by higher system version v{highest_version_agent['version']}"
|
|
201
|
+
)
|
|
202
|
+
elif other_agent[
|
|
203
|
+
"source"
|
|
204
|
+
] == "user" and highest_version_agent["source"] in [
|
|
205
|
+
"system",
|
|
206
|
+
"project",
|
|
207
|
+
]:
|
|
208
|
+
self.logger.warning(
|
|
209
|
+
f"User agent '{agent_name}' v{other_agent['version']} "
|
|
210
|
+
f"overridden by higher {highest_version_agent['source']} version v{highest_version_agent['version']}"
|
|
211
|
+
)
|
|
212
|
+
elif (
|
|
213
|
+
version_comparison == 0
|
|
214
|
+
and other_agent["source"] != highest_version_agent["source"]
|
|
185
215
|
):
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
f"
|
|
189
|
-
|
|
190
|
-
elif other_agent["source"] == "user" and highest_version_agent[
|
|
191
|
-
"source"
|
|
192
|
-
] in ["system", "project"]:
|
|
193
|
-
self.logger.warning(
|
|
194
|
-
f"User agent '{agent_name}' v{other_agent['version']} "
|
|
195
|
-
f"overridden by higher {highest_version_agent['source']} version v{highest_version_agent['version']}"
|
|
216
|
+
# Log info when versions are equal but different sources
|
|
217
|
+
self.logger.info(
|
|
218
|
+
f"Using {highest_version_agent['source']} source for '{agent_name}' "
|
|
219
|
+
f"(same version v{highest_version_agent['version']} as {other_agent['source']} source)"
|
|
196
220
|
)
|
|
197
221
|
|
|
198
222
|
return selected_agents
|
|
@@ -469,6 +493,47 @@ class MultiSourceAgentDeploymentService:
|
|
|
469
493
|
|
|
470
494
|
return cleanup_results
|
|
471
495
|
|
|
496
|
+
def _is_user_created_agent(self, agent_file: Path) -> bool:
|
|
497
|
+
"""Check if an agent is user-created based on metadata.
|
|
498
|
+
|
|
499
|
+
User agents are identified by:
|
|
500
|
+
- Lack of MPM authorship indicators
|
|
501
|
+
- Missing version or v0.0.0
|
|
502
|
+
- Certain naming patterns
|
|
503
|
+
|
|
504
|
+
Args:
|
|
505
|
+
agent_file: Path to the agent file to check
|
|
506
|
+
|
|
507
|
+
Returns:
|
|
508
|
+
True if the agent appears to be user-created, False otherwise
|
|
509
|
+
"""
|
|
510
|
+
try:
|
|
511
|
+
content = agent_file.read_text()
|
|
512
|
+
|
|
513
|
+
# Check for MPM authorship indicators
|
|
514
|
+
mpm_indicators = [
|
|
515
|
+
"author: claude-mpm",
|
|
516
|
+
"author: 'claude-mpm'",
|
|
517
|
+
'author: "claude-mpm"',
|
|
518
|
+
"author: Claude MPM",
|
|
519
|
+
"Claude MPM Team",
|
|
520
|
+
"Generated by Claude MPM",
|
|
521
|
+
"claude-mpm-project",
|
|
522
|
+
]
|
|
523
|
+
|
|
524
|
+
for indicator in mpm_indicators:
|
|
525
|
+
if indicator.lower() in content.lower():
|
|
526
|
+
return False # This is an MPM agent
|
|
527
|
+
|
|
528
|
+
# Check for version 0.0.0 (typical user agent default)
|
|
529
|
+
if "version: 0.0.0" in content or "version: '0.0.0'" in content:
|
|
530
|
+
return True
|
|
531
|
+
|
|
532
|
+
return True # Default to user-created if no MPM indicators
|
|
533
|
+
|
|
534
|
+
except Exception:
|
|
535
|
+
return True # Default to user-created if we can't read it
|
|
536
|
+
|
|
472
537
|
def _apply_config_filters(
|
|
473
538
|
self, selected_agents: Dict[str, Dict[str, Any]], config: Config
|
|
474
539
|
) -> Dict[str, Dict[str, Any]]:
|
|
@@ -534,7 +599,8 @@ class MultiSourceAgentDeploymentService:
|
|
|
534
599
|
"needs_update": [],
|
|
535
600
|
"up_to_date": [],
|
|
536
601
|
"new_agents": [],
|
|
537
|
-
"orphaned_agents": [], #
|
|
602
|
+
"orphaned_agents": [], # System agents without templates
|
|
603
|
+
"user_agents": [], # User-created agents (no templates required)
|
|
538
604
|
"version_upgrades": [],
|
|
539
605
|
"version_downgrades": [],
|
|
540
606
|
"source_changes": [],
|
|
@@ -655,10 +721,11 @@ class MultiSourceAgentDeploymentService:
|
|
|
655
721
|
)
|
|
656
722
|
|
|
657
723
|
# Check for orphaned agents (deployed but no template)
|
|
658
|
-
|
|
724
|
+
system_orphaned, user_orphaned = self._detect_orphaned_agents_simple(
|
|
659
725
|
deployed_agents_dir, agents_to_deploy
|
|
660
726
|
)
|
|
661
|
-
comparison_results["orphaned_agents"] =
|
|
727
|
+
comparison_results["orphaned_agents"] = system_orphaned
|
|
728
|
+
comparison_results["user_agents"] = user_orphaned
|
|
662
729
|
|
|
663
730
|
# Log summary
|
|
664
731
|
summary_parts = [
|
|
@@ -668,23 +735,29 @@ class MultiSourceAgentDeploymentService:
|
|
|
668
735
|
]
|
|
669
736
|
if comparison_results["orphaned_agents"]:
|
|
670
737
|
summary_parts.append(
|
|
671
|
-
f"{len(comparison_results['orphaned_agents'])} orphaned"
|
|
738
|
+
f"{len(comparison_results['orphaned_agents'])} system orphaned"
|
|
739
|
+
)
|
|
740
|
+
if comparison_results["user_agents"]:
|
|
741
|
+
summary_parts.append(
|
|
742
|
+
f"{len(comparison_results['user_agents'])} user agents"
|
|
672
743
|
)
|
|
673
744
|
|
|
674
745
|
self.logger.info(f"Version comparison complete: {', '.join(summary_parts)}")
|
|
675
746
|
|
|
747
|
+
# Don't log upgrades here - let the caller decide when to log
|
|
748
|
+
# This prevents repeated upgrade messages on every startup
|
|
676
749
|
if comparison_results["version_upgrades"]:
|
|
677
750
|
for upgrade in comparison_results["version_upgrades"]:
|
|
678
|
-
self.logger.
|
|
679
|
-
f" Upgrade: {upgrade['name']} "
|
|
751
|
+
self.logger.debug(
|
|
752
|
+
f" Upgrade available: {upgrade['name']} "
|
|
680
753
|
f"{upgrade['deployed_version']} -> {upgrade['new_version']} "
|
|
681
754
|
f"(from {upgrade['source']})"
|
|
682
755
|
)
|
|
683
756
|
|
|
684
757
|
if comparison_results["source_changes"]:
|
|
685
758
|
for change in comparison_results["source_changes"]:
|
|
686
|
-
self.logger.
|
|
687
|
-
f" Source change: {change['name']} "
|
|
759
|
+
self.logger.debug(
|
|
760
|
+
f" Source change available: {change['name']} "
|
|
688
761
|
f"from {change['from_source']} to {change['to_source']}"
|
|
689
762
|
)
|
|
690
763
|
|
|
@@ -698,10 +771,10 @@ class MultiSourceAgentDeploymentService:
|
|
|
698
771
|
f"{downgrade['template_version']} (keeping deployed version)"
|
|
699
772
|
)
|
|
700
773
|
|
|
701
|
-
# Log orphaned agents if found
|
|
774
|
+
# Log system orphaned agents if found
|
|
702
775
|
if comparison_results["orphaned_agents"]:
|
|
703
776
|
self.logger.info(
|
|
704
|
-
f"Found {len(comparison_results['orphaned_agents'])} orphaned agent(s) "
|
|
777
|
+
f"Found {len(comparison_results['orphaned_agents'])} system orphaned agent(s) "
|
|
705
778
|
f"(deployed without templates):"
|
|
706
779
|
)
|
|
707
780
|
for orphan in comparison_results["orphaned_agents"]:
|
|
@@ -710,6 +783,18 @@ class MultiSourceAgentDeploymentService:
|
|
|
710
783
|
f"(consider removing or creating a template)"
|
|
711
784
|
)
|
|
712
785
|
|
|
786
|
+
# Log user agents at debug level if found
|
|
787
|
+
if comparison_results["user_agents"]:
|
|
788
|
+
self.logger.debug(
|
|
789
|
+
f"Found {len(comparison_results['user_agents'])} user-created agent(s) "
|
|
790
|
+
f"(no templates required):"
|
|
791
|
+
)
|
|
792
|
+
for user_agent in comparison_results["user_agents"]:
|
|
793
|
+
self.logger.debug(
|
|
794
|
+
f" - {user_agent['name']} v{user_agent['version']} "
|
|
795
|
+
f"(user-created agent)"
|
|
796
|
+
)
|
|
797
|
+
|
|
713
798
|
return comparison_results
|
|
714
799
|
|
|
715
800
|
def _infer_agent_source_from_context(
|
|
@@ -767,11 +852,13 @@ class MultiSourceAgentDeploymentService:
|
|
|
767
852
|
):
|
|
768
853
|
# In development mode, unknown agents are likely system agents being tested
|
|
769
854
|
return "system"
|
|
770
|
-
if
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
855
|
+
if (
|
|
856
|
+
deployment_context == DeploymentContext.PIPX_INSTALL
|
|
857
|
+
and agent_name.count("-") <= 2
|
|
858
|
+
and len(agent_name) <= 20
|
|
859
|
+
):
|
|
860
|
+
# In pipx mode, check if agent follows system naming patterns
|
|
861
|
+
return "system"
|
|
775
862
|
except Exception:
|
|
776
863
|
pass
|
|
777
864
|
|
|
@@ -860,7 +947,7 @@ class MultiSourceAgentDeploymentService:
|
|
|
860
947
|
|
|
861
948
|
def _detect_orphaned_agents_simple(
|
|
862
949
|
self, deployed_agents_dir: Path, agents_to_deploy: Dict[str, Path]
|
|
863
|
-
) -> List[Dict[str, Any]]:
|
|
950
|
+
) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]:
|
|
864
951
|
"""Simple orphan detection that works with agents_to_deploy structure.
|
|
865
952
|
|
|
866
953
|
Args:
|
|
@@ -868,12 +955,13 @@ class MultiSourceAgentDeploymentService:
|
|
|
868
955
|
agents_to_deploy: Dictionary mapping file stems to template paths
|
|
869
956
|
|
|
870
957
|
Returns:
|
|
871
|
-
|
|
958
|
+
Tuple of (system_orphaned_agents, user_orphaned_agents)
|
|
872
959
|
"""
|
|
873
|
-
|
|
960
|
+
system_orphaned = []
|
|
961
|
+
user_orphaned = []
|
|
874
962
|
|
|
875
963
|
if not deployed_agents_dir.exists():
|
|
876
|
-
return
|
|
964
|
+
return system_orphaned, user_orphaned
|
|
877
965
|
|
|
878
966
|
# agents_to_deploy already contains file stems as keys
|
|
879
967
|
available_stems = set(agents_to_deploy.keys())
|
|
@@ -885,7 +973,7 @@ class MultiSourceAgentDeploymentService:
|
|
|
885
973
|
if agent_stem in available_stems:
|
|
886
974
|
continue
|
|
887
975
|
|
|
888
|
-
# This is an orphaned agent
|
|
976
|
+
# This is an orphaned agent - determine if it's user-created or system
|
|
889
977
|
try:
|
|
890
978
|
deployed_content = deployed_file.read_text()
|
|
891
979
|
deployed_version, _, _ = (
|
|
@@ -899,11 +987,19 @@ class MultiSourceAgentDeploymentService:
|
|
|
899
987
|
except Exception:
|
|
900
988
|
version_str = "unknown"
|
|
901
989
|
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
990
|
+
orphan_info = {
|
|
991
|
+
"name": agent_stem,
|
|
992
|
+
"file": str(deployed_file),
|
|
993
|
+
"version": version_str,
|
|
994
|
+
}
|
|
905
995
|
|
|
906
|
-
|
|
996
|
+
# Determine if this is a user-created agent
|
|
997
|
+
if self._is_user_created_agent(deployed_file):
|
|
998
|
+
user_orphaned.append(orphan_info)
|
|
999
|
+
else:
|
|
1000
|
+
system_orphaned.append(orphan_info)
|
|
1001
|
+
|
|
1002
|
+
return system_orphaned, user_orphaned
|
|
907
1003
|
|
|
908
1004
|
def cleanup_orphaned_agents(
|
|
909
1005
|
self, deployed_agents_dir: Path, dry_run: bool = True
|