claude-mpm 4.21.3__py3-none-any.whl → 5.1.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +12 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1239 -674
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +10 -35
- claude_mpm/agents/frontmatter_validator.py +69 -1
- claude_mpm/agents/templates/circuit-breakers.md +1254 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +188 -30
- claude_mpm/cli/commands/agents.py +1128 -36
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +537 -239
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +935 -45
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +50 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +125 -167
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +757 -20
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +1032 -47
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +310 -4
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
- claude_mpm/cli/parsers/base_parser.py +53 -0
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +145 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +564 -108
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
- claude_mpm/commands/mpm-agents-detect.md +9 -0
- claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
- claude_mpm/commands/mpm-agents-recommend.md +9 -0
- claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +14 -2
- claude_mpm/commands/mpm-init.md +27 -2
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
- claude_mpm/commands/mpm-status.md +9 -0
- claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +9 -0
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +19 -35
- claude_mpm/core/config.py +24 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +131 -10
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +110 -8
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +129 -1
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +45 -9
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +225 -18
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +557 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +200 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +29 -9
- claude_mpm/services/monitor/daemon_manager.py +96 -19
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/server/core.py +1 -4
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/performance-profiling.md +6 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
- claude_mpm/utils/agent_dependency_loader.py +80 -13
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/METADATA +496 -65
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/RECORD +284 -443
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -180
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -211
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -140
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -242
- claude_mpm/agents/templates/react_engineer.json +0 -238
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/ticketing.json +0 -177
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -157
- claude_mpm/agents/templates/web_qa.json +0 -399
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/top_level.txt +0 -0
|
@@ -80,18 +80,20 @@ class DaemonManager:
|
|
|
80
80
|
self.startup_status_file = None
|
|
81
81
|
|
|
82
82
|
def _get_default_pid_file(self) -> Path:
|
|
83
|
-
"""Get default PID file path."""
|
|
83
|
+
"""Get default PID file path with port number to support multiple daemons."""
|
|
84
84
|
project_root = Path.cwd()
|
|
85
85
|
claude_mpm_dir = project_root / ".claude-mpm"
|
|
86
86
|
claude_mpm_dir.mkdir(exist_ok=True)
|
|
87
|
-
|
|
87
|
+
# Include port in filename to support multiple daemon instances
|
|
88
|
+
return claude_mpm_dir / f"monitor-daemon-{self.port}.pid"
|
|
88
89
|
|
|
89
90
|
def _get_default_log_file(self) -> Path:
|
|
90
|
-
"""Get default log file path."""
|
|
91
|
+
"""Get default log file path with port number to support multiple daemons."""
|
|
91
92
|
project_root = Path.cwd()
|
|
92
93
|
claude_mpm_dir = project_root / ".claude-mpm"
|
|
93
94
|
claude_mpm_dir.mkdir(exist_ok=True)
|
|
94
|
-
|
|
95
|
+
# Include port in filename to support multiple daemon instances
|
|
96
|
+
return claude_mpm_dir / f"monitor-daemon-{self.port}.log"
|
|
95
97
|
|
|
96
98
|
def cleanup_port_conflicts(self, max_retries: int = 3) -> bool:
|
|
97
99
|
"""Clean up any processes using the daemon port.
|
|
@@ -471,6 +473,55 @@ class DaemonManager:
|
|
|
471
473
|
|
|
472
474
|
return None
|
|
473
475
|
|
|
476
|
+
def _verify_daemon_health(self, max_attempts: int = 3) -> bool:
|
|
477
|
+
"""Verify daemon is healthy by checking HTTP health endpoint.
|
|
478
|
+
|
|
479
|
+
Args:
|
|
480
|
+
max_attempts: Maximum number of connection attempts
|
|
481
|
+
|
|
482
|
+
Returns:
|
|
483
|
+
True if health check passes, False otherwise
|
|
484
|
+
"""
|
|
485
|
+
try:
|
|
486
|
+
import requests
|
|
487
|
+
|
|
488
|
+
for attempt in range(max_attempts):
|
|
489
|
+
try:
|
|
490
|
+
# Try to connect to health endpoint
|
|
491
|
+
response = requests.get(
|
|
492
|
+
f"http://{self.host}:{self.port}/health", timeout=2
|
|
493
|
+
)
|
|
494
|
+
|
|
495
|
+
if response.status_code == 200:
|
|
496
|
+
self.logger.debug(
|
|
497
|
+
f"Health check passed on attempt {attempt + 1}/{max_attempts}"
|
|
498
|
+
)
|
|
499
|
+
return True
|
|
500
|
+
|
|
501
|
+
self.logger.debug(
|
|
502
|
+
f"Health check returned status {response.status_code} on attempt {attempt + 1}/{max_attempts}"
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
except requests.exceptions.RequestException as e:
|
|
506
|
+
self.logger.debug(
|
|
507
|
+
f"Health check attempt {attempt + 1}/{max_attempts} failed: {e}"
|
|
508
|
+
)
|
|
509
|
+
|
|
510
|
+
# Wait before retry (except on last attempt)
|
|
511
|
+
if attempt < max_attempts - 1:
|
|
512
|
+
time.sleep(1)
|
|
513
|
+
|
|
514
|
+
self.logger.debug(f"Health check failed after {max_attempts} attempts")
|
|
515
|
+
return False
|
|
516
|
+
|
|
517
|
+
except ImportError:
|
|
518
|
+
# requests not available, skip health check
|
|
519
|
+
self.logger.debug("requests library not available, skipping health check")
|
|
520
|
+
return True
|
|
521
|
+
except Exception as e:
|
|
522
|
+
self.logger.debug(f"Health check error: {e}")
|
|
523
|
+
return False
|
|
524
|
+
|
|
474
525
|
def start_daemon(self, force_restart: bool = False) -> bool:
|
|
475
526
|
"""Start the daemon with automatic cleanup and retry.
|
|
476
527
|
|
|
@@ -588,36 +639,62 @@ class DaemonManager:
|
|
|
588
639
|
pid = process.pid
|
|
589
640
|
self.logger.info(f"Monitor subprocess started with PID {pid}")
|
|
590
641
|
|
|
591
|
-
# Wait for the subprocess to write its PID file
|
|
642
|
+
# Wait for the subprocess to write its PID file and bind to port
|
|
592
643
|
# The subprocess will write the PID file after it starts successfully
|
|
593
644
|
max_wait = 10 # seconds
|
|
594
645
|
start_time = time.time()
|
|
646
|
+
pid_file_found = False
|
|
647
|
+
port_bound = False
|
|
648
|
+
|
|
649
|
+
self.logger.debug(f"Waiting up to {max_wait}s for daemon to start...")
|
|
595
650
|
|
|
596
651
|
while time.time() - start_time < max_wait:
|
|
597
652
|
# Check if process is still running
|
|
598
|
-
|
|
599
|
-
|
|
653
|
+
returncode = process.poll()
|
|
654
|
+
if returncode is not None:
|
|
655
|
+
# Process exited - this is the bug we're fixing!
|
|
656
|
+
self.logger.error(
|
|
657
|
+
f"Monitor daemon subprocess exited prematurely with code {returncode}"
|
|
658
|
+
)
|
|
600
659
|
self.logger.error(
|
|
601
|
-
f"
|
|
660
|
+
f"Port {self.port} daemon failed to start. Check {self.log_file} for details."
|
|
602
661
|
)
|
|
603
662
|
return False
|
|
604
663
|
|
|
605
664
|
# Check if PID file was written
|
|
606
|
-
if self.pid_file.exists():
|
|
665
|
+
if not pid_file_found and self.pid_file.exists():
|
|
607
666
|
try:
|
|
608
667
|
with self.pid_file.open() as f:
|
|
609
668
|
written_pid = int(f.read().strip())
|
|
610
669
|
if written_pid == pid:
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
)
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
670
|
+
pid_file_found = True
|
|
671
|
+
self.logger.debug(
|
|
672
|
+
f"PID file found with correct PID {pid}"
|
|
673
|
+
)
|
|
674
|
+
except Exception as e:
|
|
675
|
+
self.logger.debug(f"Error reading PID file: {e}")
|
|
676
|
+
|
|
677
|
+
# Check if port is bound (health check)
|
|
678
|
+
if not port_bound and not self._is_port_available():
|
|
679
|
+
# Port NOT available means it's in use (good!)
|
|
680
|
+
port_bound = True
|
|
681
|
+
self.logger.debug(f"Port {self.port} is now bound")
|
|
682
|
+
|
|
683
|
+
# Success criteria: both PID file exists and port is bound
|
|
684
|
+
if pid_file_found and port_bound:
|
|
685
|
+
self.logger.info(
|
|
686
|
+
f"Monitor daemon successfully started on port {self.port} (PID: {pid})"
|
|
687
|
+
)
|
|
688
|
+
# Additional health check: verify we can connect
|
|
689
|
+
if self._verify_daemon_health(max_attempts=3):
|
|
690
|
+
self.logger.info("Daemon health check passed")
|
|
691
|
+
return True
|
|
692
|
+
self.logger.warning(
|
|
693
|
+
"Daemon started but health check failed - may still be initializing"
|
|
694
|
+
)
|
|
695
|
+
return (
|
|
696
|
+
True # Return success anyway if PID file and port are good
|
|
697
|
+
)
|
|
621
698
|
|
|
622
699
|
time.sleep(0.5)
|
|
623
700
|
|
|
@@ -203,8 +203,8 @@ class UnifiedMonitorServer:
|
|
|
203
203
|
# Create Socket.IO server with proper ping configuration
|
|
204
204
|
self.sio = socketio.AsyncServer(
|
|
205
205
|
cors_allowed_origins="*",
|
|
206
|
-
logger=
|
|
207
|
-
engineio_logger=
|
|
206
|
+
logger=True, # Enable to see Socket.IO events and connection lifecycle
|
|
207
|
+
engineio_logger=True, # Enable to see Engine.IO protocol handshake details
|
|
208
208
|
ping_interval=30, # 30 seconds ping interval (matches client expectation)
|
|
209
209
|
ping_timeout=60, # 60 seconds ping timeout (generous for stability)
|
|
210
210
|
)
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"""Native Agent Converter Service
|
|
2
|
+
|
|
3
|
+
Converts MPM agent JSON definitions to Claude Code --agents flag format.
|
|
4
|
+
|
|
5
|
+
WHY: Claude Code 1.0.83+ supports native --agents flag for dynamic agent definition.
|
|
6
|
+
This allows agents to be passed directly via CLI instead of deployed to .claude/agents/.
|
|
7
|
+
|
|
8
|
+
DESIGN: Converts MPM agent schema → Claude native schema with field mappings:
|
|
9
|
+
- description → description (agent selection hint)
|
|
10
|
+
- system_instructions → prompt (agent behavior)
|
|
11
|
+
- allowed_tools → tools (tool limitations)
|
|
12
|
+
- model_tier → model (model selection)
|
|
13
|
+
|
|
14
|
+
USAGE:
|
|
15
|
+
converter = NativeAgentConverter()
|
|
16
|
+
agents_flag = converter.build_agents_flag(agent_configs)
|
|
17
|
+
# Returns: --agents '{"agent-name": {...}, ...}'
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Any, Dict, List, Optional
|
|
23
|
+
|
|
24
|
+
from claude_mpm.core.logging_config import get_logger
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class NativeAgentConverter:
|
|
28
|
+
"""Converts MPM agent configurations to Claude Code --agents format."""
|
|
29
|
+
|
|
30
|
+
# Map MPM model tiers to Claude model names
|
|
31
|
+
MODEL_TIER_MAP = {
|
|
32
|
+
"opus": "opus",
|
|
33
|
+
"sonnet": "sonnet",
|
|
34
|
+
"haiku": "haiku",
|
|
35
|
+
"claude-3-opus": "opus",
|
|
36
|
+
"claude-3-sonnet": "sonnet",
|
|
37
|
+
"claude-3-haiku": "haiku",
|
|
38
|
+
"claude-3.5-sonnet": "sonnet",
|
|
39
|
+
"claude-4-sonnet": "sonnet",
|
|
40
|
+
"claude-4-opus": "opus",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# Map MPM tool names to Claude tool names
|
|
44
|
+
TOOL_NAME_MAP = {
|
|
45
|
+
"Read": "Read",
|
|
46
|
+
"Write": "Write",
|
|
47
|
+
"Edit": "Edit",
|
|
48
|
+
"MultiEdit": "MultiEdit",
|
|
49
|
+
"Bash": "Bash",
|
|
50
|
+
"Grep": "Grep",
|
|
51
|
+
"Glob": "Glob",
|
|
52
|
+
"LS": "LS",
|
|
53
|
+
"WebSearch": "WebSearch",
|
|
54
|
+
"WebFetch": "WebFetch",
|
|
55
|
+
"TodoWrite": "TodoWrite",
|
|
56
|
+
"NotebookEdit": "NotebookEdit",
|
|
57
|
+
"BashOutput": "BashOutput",
|
|
58
|
+
"KillShell": "KillShell",
|
|
59
|
+
"AskUserQuestion": "AskUserQuestion",
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
def __init__(self):
|
|
63
|
+
"""Initialize the native agent converter."""
|
|
64
|
+
self.logger = get_logger(__name__)
|
|
65
|
+
|
|
66
|
+
def convert_mpm_agent_to_native(
|
|
67
|
+
self, agent_config: Dict[str, Any], agent_id: Optional[str] = None
|
|
68
|
+
) -> Dict[str, Any]:
|
|
69
|
+
"""Convert a single MPM agent config to Claude native format.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
agent_config: MPM agent JSON configuration
|
|
73
|
+
agent_id: Optional agent ID (falls back to agent_config['agent_id'])
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Dict with Claude native agent format:
|
|
77
|
+
{
|
|
78
|
+
"description": "...",
|
|
79
|
+
"prompt": "...",
|
|
80
|
+
"tools": [...],
|
|
81
|
+
"model": "sonnet"
|
|
82
|
+
}
|
|
83
|
+
"""
|
|
84
|
+
try:
|
|
85
|
+
# Extract agent ID
|
|
86
|
+
if not agent_id:
|
|
87
|
+
agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
|
|
88
|
+
|
|
89
|
+
# Extract description (for agent selection)
|
|
90
|
+
description = agent_config.get("description", "")
|
|
91
|
+
if not description and "metadata" in agent_config:
|
|
92
|
+
description = agent_config["metadata"].get("description", "")
|
|
93
|
+
|
|
94
|
+
# Build prompt from instructions and BASE_*.md reference
|
|
95
|
+
prompt = self._build_agent_prompt(agent_config)
|
|
96
|
+
|
|
97
|
+
# Extract and map tools
|
|
98
|
+
tools = self._extract_and_map_tools(agent_config)
|
|
99
|
+
|
|
100
|
+
# Map model tier
|
|
101
|
+
model = self._map_model_tier(agent_config)
|
|
102
|
+
|
|
103
|
+
native_config = {
|
|
104
|
+
"description": description,
|
|
105
|
+
"prompt": prompt,
|
|
106
|
+
"tools": tools,
|
|
107
|
+
"model": model,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
self.logger.debug(f"Converted agent '{agent_id}' to native format")
|
|
111
|
+
return native_config
|
|
112
|
+
|
|
113
|
+
except Exception as e:
|
|
114
|
+
self.logger.error(f"Error converting agent {agent_id}: {e}")
|
|
115
|
+
# Return minimal valid config as fallback
|
|
116
|
+
return {
|
|
117
|
+
"description": f"Agent {agent_id}",
|
|
118
|
+
"prompt": agent_config.get("instructions", ""),
|
|
119
|
+
"tools": [],
|
|
120
|
+
"model": "sonnet",
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
def _build_agent_prompt(self, agent_config: Dict[str, Any]) -> str:
|
|
124
|
+
"""Build agent prompt from instructions and BASE_*.md reference.
|
|
125
|
+
|
|
126
|
+
OPTIMIZATION: Keep prompts concise for CLI argument length limits.
|
|
127
|
+
The BASE_*.md files contain full instructions, so we only need:
|
|
128
|
+
1. Reference to BASE file
|
|
129
|
+
2. Brief specialization note
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
agent_config: MPM agent configuration
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
Concise prompt string
|
|
136
|
+
"""
|
|
137
|
+
prompt_parts = []
|
|
138
|
+
|
|
139
|
+
# Add base instructions reference if available (most important)
|
|
140
|
+
if "knowledge" in agent_config:
|
|
141
|
+
base_file = agent_config["knowledge"].get("base_instructions_file")
|
|
142
|
+
if base_file:
|
|
143
|
+
prompt_parts.append(f"Follow {base_file} for all protocols.")
|
|
144
|
+
|
|
145
|
+
# Add main instructions (keep brief)
|
|
146
|
+
instructions = agent_config.get("instructions", "")
|
|
147
|
+
if instructions:
|
|
148
|
+
# Limit instruction length to avoid bloat
|
|
149
|
+
if len(instructions) > 300:
|
|
150
|
+
instructions = instructions[:300] + "..."
|
|
151
|
+
prompt_parts.append(instructions)
|
|
152
|
+
|
|
153
|
+
# Skip domain expertise and best practices for CLI mode
|
|
154
|
+
# These are already in BASE_*.md files referenced above
|
|
155
|
+
# Adding them here just bloats the JSON unnecessarily
|
|
156
|
+
|
|
157
|
+
return "\n".join(str(part) for part in prompt_parts if part)
|
|
158
|
+
|
|
159
|
+
def _extract_and_map_tools(self, agent_config: Dict[str, Any]) -> List[str]:
|
|
160
|
+
"""Extract and map tools from MPM config to Claude tool names.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
agent_config: MPM agent configuration
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
List of Claude tool names
|
|
167
|
+
"""
|
|
168
|
+
tools = []
|
|
169
|
+
|
|
170
|
+
# Check capabilities.tools
|
|
171
|
+
if "capabilities" in agent_config and "tools" in agent_config["capabilities"]:
|
|
172
|
+
mpm_tools = agent_config["capabilities"]["tools"]
|
|
173
|
+
for tool in mpm_tools:
|
|
174
|
+
mapped_tool = self.TOOL_NAME_MAP.get(tool, tool)
|
|
175
|
+
if mapped_tool not in tools:
|
|
176
|
+
tools.append(mapped_tool)
|
|
177
|
+
|
|
178
|
+
# If no tools specified, provide reasonable defaults
|
|
179
|
+
if not tools:
|
|
180
|
+
tools = ["Read", "Write", "Edit", "Bash", "Grep", "Glob"]
|
|
181
|
+
|
|
182
|
+
return tools
|
|
183
|
+
|
|
184
|
+
def _map_model_tier(self, agent_config: Dict[str, Any]) -> str:
|
|
185
|
+
"""Map MPM model tier to Claude model name.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
agent_config: MPM agent configuration
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
Claude model name (opus, sonnet, haiku)
|
|
192
|
+
"""
|
|
193
|
+
# Check capabilities.model
|
|
194
|
+
if "capabilities" in agent_config and "model" in agent_config["capabilities"]:
|
|
195
|
+
model_tier = agent_config["capabilities"]["model"]
|
|
196
|
+
return self.MODEL_TIER_MAP.get(model_tier.lower(), "sonnet")
|
|
197
|
+
|
|
198
|
+
# Check metadata.model_preference
|
|
199
|
+
if (
|
|
200
|
+
"metadata" in agent_config
|
|
201
|
+
and "model_preference" in agent_config["metadata"]
|
|
202
|
+
):
|
|
203
|
+
model_tier = agent_config["metadata"]["model_preference"]
|
|
204
|
+
return self.MODEL_TIER_MAP.get(model_tier.lower(), "sonnet")
|
|
205
|
+
|
|
206
|
+
# Default to sonnet
|
|
207
|
+
return "sonnet"
|
|
208
|
+
|
|
209
|
+
def generate_agents_json(self, agents: List[Dict[str, Any]]) -> str:
|
|
210
|
+
"""Generate complete --agents JSON string from list of agent configs.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
agents: List of MPM agent configurations
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
JSON string for --agents flag
|
|
217
|
+
"""
|
|
218
|
+
native_agents = {}
|
|
219
|
+
|
|
220
|
+
for agent_config in agents:
|
|
221
|
+
agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
|
|
222
|
+
if not agent_id:
|
|
223
|
+
self.logger.warning("Skipping agent without ID")
|
|
224
|
+
continue
|
|
225
|
+
|
|
226
|
+
# Skip PM agent (main Claude instance)
|
|
227
|
+
if agent_id.lower() in ["pm", "project_manager"]:
|
|
228
|
+
self.logger.debug(f"Skipping PM agent: {agent_id}")
|
|
229
|
+
continue
|
|
230
|
+
|
|
231
|
+
native_config = self.convert_mpm_agent_to_native(agent_config, agent_id)
|
|
232
|
+
native_agents[agent_id] = native_config
|
|
233
|
+
|
|
234
|
+
return json.dumps(native_agents, separators=(",", ":"))
|
|
235
|
+
|
|
236
|
+
def build_agents_flag(
|
|
237
|
+
self, agents: List[Dict[str, Any]], escape_for_shell: bool = True
|
|
238
|
+
) -> str:
|
|
239
|
+
"""Build complete --agents flag for CLI.
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
agents: List of MPM agent configurations
|
|
243
|
+
escape_for_shell: Whether to escape JSON for shell
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
Complete flag string: --agents '{"agent1": {...}, ...}'
|
|
247
|
+
"""
|
|
248
|
+
agents_json = self.generate_agents_json(agents)
|
|
249
|
+
|
|
250
|
+
# Check length (Claude CLI has argument length limits)
|
|
251
|
+
if len(agents_json) > 50000: # Conservative limit
|
|
252
|
+
self.logger.warning(
|
|
253
|
+
f"Agents JSON is very large ({len(agents_json)} chars). "
|
|
254
|
+
"Consider using file-based deployment."
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
if escape_for_shell:
|
|
258
|
+
# Escape for shell - wrap in single quotes
|
|
259
|
+
return f"--agents '{agents_json}'"
|
|
260
|
+
|
|
261
|
+
return f"--agents {agents_json}"
|
|
262
|
+
|
|
263
|
+
def load_agents_from_templates(
|
|
264
|
+
self, templates_dir: Optional[Path] = None
|
|
265
|
+
) -> List[Dict[str, Any]]:
|
|
266
|
+
"""Load all agent configs from templates directory.
|
|
267
|
+
|
|
268
|
+
Args:
|
|
269
|
+
templates_dir: Path to templates directory (defaults to MPM agents)
|
|
270
|
+
|
|
271
|
+
Returns:
|
|
272
|
+
List of agent configurations
|
|
273
|
+
"""
|
|
274
|
+
if not templates_dir:
|
|
275
|
+
# Default to MPM agents directory
|
|
276
|
+
mpm_package_dir = Path(__file__).parent.parent / "agents" / "templates"
|
|
277
|
+
templates_dir = mpm_package_dir
|
|
278
|
+
|
|
279
|
+
if not templates_dir.exists():
|
|
280
|
+
self.logger.warning(f"Templates directory not found: {templates_dir}")
|
|
281
|
+
return []
|
|
282
|
+
|
|
283
|
+
agents = []
|
|
284
|
+
json_files = list(templates_dir.glob("*.json"))
|
|
285
|
+
|
|
286
|
+
self.logger.info(
|
|
287
|
+
f"Loading {len(json_files)} agent templates from {templates_dir}"
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
for json_file in json_files:
|
|
291
|
+
try:
|
|
292
|
+
# Skip base_agent.json
|
|
293
|
+
if json_file.stem == "base_agent":
|
|
294
|
+
continue
|
|
295
|
+
|
|
296
|
+
agent_config = json.loads(json_file.read_text())
|
|
297
|
+
agents.append(agent_config)
|
|
298
|
+
self.logger.debug(f"Loaded agent: {json_file.stem}")
|
|
299
|
+
|
|
300
|
+
except Exception as e:
|
|
301
|
+
self.logger.error(f"Error loading agent {json_file.name}: {e}")
|
|
302
|
+
continue
|
|
303
|
+
|
|
304
|
+
return agents
|
|
305
|
+
|
|
306
|
+
def estimate_json_size(self, agents: List[Dict[str, Any]]) -> int:
|
|
307
|
+
"""Estimate the size of --agents JSON output.
|
|
308
|
+
|
|
309
|
+
Args:
|
|
310
|
+
agents: List of agent configurations
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
Estimated size in bytes
|
|
314
|
+
"""
|
|
315
|
+
agents_json = self.generate_agents_json(agents)
|
|
316
|
+
return len(agents_json.encode("utf-8"))
|
|
317
|
+
|
|
318
|
+
def get_conversion_summary(self, agents: List[Dict[str, Any]]) -> Dict[str, Any]:
|
|
319
|
+
"""Get summary of agent conversion for reporting.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
agents: List of agent configurations
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
Summary dict with counts and size info
|
|
326
|
+
"""
|
|
327
|
+
native_agents = {}
|
|
328
|
+
model_counts = {"opus": 0, "sonnet": 0, "haiku": 0}
|
|
329
|
+
tool_usage = {}
|
|
330
|
+
|
|
331
|
+
for agent_config in agents:
|
|
332
|
+
agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
|
|
333
|
+
if not agent_id or agent_id.lower() in ["pm", "project_manager"]:
|
|
334
|
+
continue
|
|
335
|
+
|
|
336
|
+
native_config = self.convert_mpm_agent_to_native(agent_config, agent_id)
|
|
337
|
+
native_agents[agent_id] = native_config
|
|
338
|
+
|
|
339
|
+
# Count models
|
|
340
|
+
model = native_config.get("model", "sonnet")
|
|
341
|
+
model_counts[model] = model_counts.get(model, 0) + 1
|
|
342
|
+
|
|
343
|
+
# Count tools
|
|
344
|
+
for tool in native_config.get("tools", []):
|
|
345
|
+
tool_usage[tool] = tool_usage.get(tool, 0) + 1
|
|
346
|
+
|
|
347
|
+
json_size = len(json.dumps(native_agents, separators=(",", ":")))
|
|
348
|
+
|
|
349
|
+
return {
|
|
350
|
+
"total_agents": len(native_agents),
|
|
351
|
+
"json_size": json_size,
|
|
352
|
+
"json_size_kb": round(json_size / 1024, 2),
|
|
353
|
+
"model_distribution": model_counts,
|
|
354
|
+
"tool_usage": tool_usage,
|
|
355
|
+
"agents": list(native_agents.keys()),
|
|
356
|
+
}
|
|
@@ -431,7 +431,7 @@ class PortManager:
|
|
|
431
431
|
return port
|
|
432
432
|
|
|
433
433
|
self.logger.error(
|
|
434
|
-
f"No available ports in range {self.PORT_RANGE.start}-{self.PORT_RANGE.stop-1}"
|
|
434
|
+
f"No available ports in range {self.PORT_RANGE.start}-{self.PORT_RANGE.stop - 1}"
|
|
435
435
|
)
|
|
436
436
|
return None
|
|
437
437
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pull Request Services Package
|
|
3
|
+
==============================
|
|
4
|
+
|
|
5
|
+
Provides PR template generation and workflow automation.
|
|
6
|
+
Used by agent-improver and skills-manager agents.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .pr_template_service import PRTemplateService, PRType
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"PRTemplateService",
|
|
13
|
+
"PRType",
|
|
14
|
+
]
|