claude-mpm 4.21.3__py3-none-any.whl → 5.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +12 -0
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +632 -334
- 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/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
- 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 +38 -2
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +125 -20
- claude_mpm/cli/commands/agents.py +684 -13
- 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 +2 -6
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +478 -44
- 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/run.py +124 -128
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +435 -1
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +919 -41
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +173 -4
- claude_mpm/cli/parsers/base_parser.py +49 -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 +138 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +499 -84
- 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 +11 -2
- claude_mpm/commands/mpm-init.md +27 -2
- claude_mpm/commands/mpm-monitor.md +9 -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 +258 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +12 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +17 -10
- 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/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 +112 -5
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +94 -4
- 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/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/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/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 +115 -15
- 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 +363 -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 +1055 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -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 +92 -1
- 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/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_gateway/config/configuration.py +1 -1
- 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/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +1 -1
- 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/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +165 -7
- 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/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/progress.py +383 -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.0.2.dist-info}/METADATA +429 -59
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +252 -425
- 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/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.0.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
|
@@ -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
|
+
]
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pull Request Template Service
|
|
3
|
+
==============================
|
|
4
|
+
|
|
5
|
+
Generates consistent PR titles and descriptions for agent/skill improvements.
|
|
6
|
+
|
|
7
|
+
Design Decisions:
|
|
8
|
+
- Follows conventional commit format
|
|
9
|
+
- Generates comprehensive PR descriptions with testing checklists
|
|
10
|
+
- Supports both agent and skill PR types
|
|
11
|
+
- Validates conventional commit message format
|
|
12
|
+
|
|
13
|
+
Example:
|
|
14
|
+
>>> service = PRTemplateService()
|
|
15
|
+
>>> title = service.generate_pr_title("research", "improve memory efficiency", PRType.AGENT)
|
|
16
|
+
>>> print(title)
|
|
17
|
+
feat(agent): improve research - improve memory efficiency
|
|
18
|
+
|
|
19
|
+
>>> body = service.generate_agent_pr_body(
|
|
20
|
+
... agent_name="research",
|
|
21
|
+
... problem="Memory exhaustion with >50 files",
|
|
22
|
+
... solution="Add hard limit of 5 files per session",
|
|
23
|
+
... testing_notes="Tested with 100-file codebase",
|
|
24
|
+
... related_issues=["#157"]
|
|
25
|
+
... )
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from enum import Enum
|
|
29
|
+
from typing import List, Optional
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class PRType(Enum):
|
|
33
|
+
"""Type of pull request."""
|
|
34
|
+
|
|
35
|
+
AGENT = "agent"
|
|
36
|
+
SKILL = "skill"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class PRTemplateService:
|
|
40
|
+
"""
|
|
41
|
+
Service for generating PR templates.
|
|
42
|
+
|
|
43
|
+
Generates consistent PR titles and descriptions following
|
|
44
|
+
conventional commit format and best practices.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
# Conventional commit types
|
|
48
|
+
COMMIT_TYPES = {
|
|
49
|
+
"feat": "New feature or enhancement",
|
|
50
|
+
"fix": "Bug fix",
|
|
51
|
+
"docs": "Documentation changes",
|
|
52
|
+
"refactor": "Code refactoring without feature changes",
|
|
53
|
+
"test": "Adding or updating tests",
|
|
54
|
+
"chore": "Maintenance tasks",
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
def generate_pr_title(
|
|
58
|
+
self,
|
|
59
|
+
item_name: str,
|
|
60
|
+
brief_description: str,
|
|
61
|
+
pr_type: PRType,
|
|
62
|
+
commit_type: str = "feat",
|
|
63
|
+
) -> str:
|
|
64
|
+
"""
|
|
65
|
+
Generate PR title in conventional commit format.
|
|
66
|
+
|
|
67
|
+
Format: {commit_type}({scope}): {item} - {brief_description}
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
item_name: Agent or skill name (e.g., "research", "fastapi-testing")
|
|
71
|
+
brief_description: Brief description (e.g., "improve memory handling")
|
|
72
|
+
pr_type: Type of PR (agent or skill)
|
|
73
|
+
commit_type: Conventional commit type (default: "feat")
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Formatted PR title
|
|
77
|
+
|
|
78
|
+
Example:
|
|
79
|
+
>>> service = PRTemplateService()
|
|
80
|
+
>>> service.generate_pr_title("research", "improve memory handling", PRType.AGENT)
|
|
81
|
+
'feat(agent): improve research - improve memory handling'
|
|
82
|
+
"""
|
|
83
|
+
scope = pr_type.value
|
|
84
|
+
return f"{commit_type}({scope}): improve {item_name} - {brief_description}"
|
|
85
|
+
|
|
86
|
+
def generate_agent_pr_body(
|
|
87
|
+
self,
|
|
88
|
+
agent_name: str,
|
|
89
|
+
problem: str,
|
|
90
|
+
solution: str,
|
|
91
|
+
testing_notes: str,
|
|
92
|
+
related_issues: Optional[List[str]] = None,
|
|
93
|
+
) -> str:
|
|
94
|
+
"""
|
|
95
|
+
Generate PR body for agent improvements.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
agent_name: Agent name (e.g., "research")
|
|
99
|
+
problem: Problem statement (what wasn't working)
|
|
100
|
+
solution: Solution overview (what was changed)
|
|
101
|
+
testing_notes: Testing performed
|
|
102
|
+
related_issues: Related issue numbers (e.g., ["#157", "#142"])
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Formatted PR body in markdown
|
|
106
|
+
|
|
107
|
+
Example:
|
|
108
|
+
>>> service = PRTemplateService()
|
|
109
|
+
>>> body = service.generate_agent_pr_body(
|
|
110
|
+
... agent_name="research",
|
|
111
|
+
... problem="Memory exhaustion when analyzing >50 files",
|
|
112
|
+
... solution="Add hard limit of 5 files per session with MCP summarizer",
|
|
113
|
+
... testing_notes="Tested with 100-file codebase, memory stayed under 4GB",
|
|
114
|
+
... related_issues=["#157"]
|
|
115
|
+
... )
|
|
116
|
+
"""
|
|
117
|
+
related_section = ""
|
|
118
|
+
if related_issues:
|
|
119
|
+
related_section = "\n\n## Related Issues\n\n"
|
|
120
|
+
for issue in related_issues:
|
|
121
|
+
# Check if it's just a number or already has #
|
|
122
|
+
issue_ref = issue if issue.startswith("#") else f"#{issue}"
|
|
123
|
+
related_section += f"Closes {issue_ref}\n"
|
|
124
|
+
|
|
125
|
+
return f"""## Problem Statement
|
|
126
|
+
|
|
127
|
+
{problem}
|
|
128
|
+
|
|
129
|
+
## Proposed Solution
|
|
130
|
+
|
|
131
|
+
{solution}
|
|
132
|
+
|
|
133
|
+
## Changes Made
|
|
134
|
+
|
|
135
|
+
**Agent:** `{agent_name}`
|
|
136
|
+
|
|
137
|
+
{self._format_changes_placeholder()}
|
|
138
|
+
|
|
139
|
+
## Testing Performed
|
|
140
|
+
|
|
141
|
+
{testing_notes}
|
|
142
|
+
|
|
143
|
+
- [x] Validated YAML frontmatter syntax
|
|
144
|
+
- [x] Tested agent with sample tasks
|
|
145
|
+
- [x] Verified no regression in existing behavior
|
|
146
|
+
{related_section}
|
|
147
|
+
## Checklist
|
|
148
|
+
|
|
149
|
+
- [x] Instructions are clear and unambiguous
|
|
150
|
+
- [x] No conflicting guidance
|
|
151
|
+
- [x] Follows agent architecture best practices
|
|
152
|
+
- [x] Documentation updated if needed
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
🤖 Generated with Claude MPM Agent Improver
|
|
156
|
+
Co-Authored-By: agent-improver <noreply@anthropic.com>
|
|
157
|
+
"""
|
|
158
|
+
|
|
159
|
+
def generate_skill_pr_body(
|
|
160
|
+
self,
|
|
161
|
+
skill_name: str,
|
|
162
|
+
improvements: str,
|
|
163
|
+
justification: str,
|
|
164
|
+
examples: str,
|
|
165
|
+
related_issues: Optional[List[str]] = None,
|
|
166
|
+
) -> str:
|
|
167
|
+
"""
|
|
168
|
+
Generate PR body for skill improvements.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
skill_name: Skill name (e.g., "fastapi-testing")
|
|
172
|
+
improvements: Description of improvements made
|
|
173
|
+
justification: Why these improvements were needed
|
|
174
|
+
examples: Examples added or updated
|
|
175
|
+
related_issues: Related issue numbers
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
Formatted PR body in markdown
|
|
179
|
+
|
|
180
|
+
Example:
|
|
181
|
+
>>> service = PRTemplateService()
|
|
182
|
+
>>> body = service.generate_skill_pr_body(
|
|
183
|
+
... skill_name="fastapi-testing",
|
|
184
|
+
... improvements="Added async test patterns and database handling",
|
|
185
|
+
... justification="Users struggled with async endpoint testing",
|
|
186
|
+
... examples="pytest-asyncio config, AsyncClient usage, DB rollback patterns",
|
|
187
|
+
... related_issues=["#203"]
|
|
188
|
+
... )
|
|
189
|
+
"""
|
|
190
|
+
related_section = ""
|
|
191
|
+
if related_issues:
|
|
192
|
+
related_section = "\n\n## Related Issues\n\n"
|
|
193
|
+
for issue in related_issues:
|
|
194
|
+
issue_ref = issue if issue.startswith("#") else f"#{issue}"
|
|
195
|
+
related_section += f"Requested by: Issue {issue_ref}\n"
|
|
196
|
+
|
|
197
|
+
return f"""## Skill Enhancement
|
|
198
|
+
|
|
199
|
+
**Skill:** `{skill_name}`
|
|
200
|
+
|
|
201
|
+
## Motivation
|
|
202
|
+
|
|
203
|
+
{justification}
|
|
204
|
+
|
|
205
|
+
## Improvements
|
|
206
|
+
|
|
207
|
+
{improvements}
|
|
208
|
+
|
|
209
|
+
## Examples Added
|
|
210
|
+
|
|
211
|
+
{examples}
|
|
212
|
+
|
|
213
|
+
## Testing
|
|
214
|
+
|
|
215
|
+
- [x] Validated YAML frontmatter
|
|
216
|
+
- [x] Verified skill syntax
|
|
217
|
+
- [x] Tested examples in relevant project
|
|
218
|
+
- [x] No conflicts with existing skills
|
|
219
|
+
{related_section}
|
|
220
|
+
---
|
|
221
|
+
🤖 Generated with Claude MPM Skills Manager
|
|
222
|
+
Co-Authored-By: skills-manager <noreply@anthropic.com>
|
|
223
|
+
"""
|
|
224
|
+
|
|
225
|
+
def validate_conventional_commit(self, message: str) -> bool:
|
|
226
|
+
"""
|
|
227
|
+
Validate that message follows conventional commit format.
|
|
228
|
+
|
|
229
|
+
Format: type(scope): description
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
message: Commit message to validate
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
True if message follows conventional commit format
|
|
236
|
+
|
|
237
|
+
Example:
|
|
238
|
+
>>> service = PRTemplateService()
|
|
239
|
+
>>> service.validate_conventional_commit("feat(agent): improve research")
|
|
240
|
+
True
|
|
241
|
+
>>> service.validate_conventional_commit("improve research agent")
|
|
242
|
+
False
|
|
243
|
+
"""
|
|
244
|
+
if not message:
|
|
245
|
+
return False
|
|
246
|
+
|
|
247
|
+
# Extract first line (title)
|
|
248
|
+
first_line = message.split("\n")[0]
|
|
249
|
+
|
|
250
|
+
# Check basic format: type(scope): description
|
|
251
|
+
if ":" not in first_line:
|
|
252
|
+
return False
|
|
253
|
+
|
|
254
|
+
# Split into type/scope and description
|
|
255
|
+
parts = first_line.split(":", 1)
|
|
256
|
+
if len(parts) != 2:
|
|
257
|
+
return False
|
|
258
|
+
|
|
259
|
+
type_scope = parts[0].strip()
|
|
260
|
+
description = parts[1].strip()
|
|
261
|
+
|
|
262
|
+
# Check type(scope) format
|
|
263
|
+
if "(" not in type_scope or ")" not in type_scope:
|
|
264
|
+
return False
|
|
265
|
+
|
|
266
|
+
# Extract type
|
|
267
|
+
commit_type = type_scope.split("(")[0].strip()
|
|
268
|
+
|
|
269
|
+
# Validate type is recognized
|
|
270
|
+
if commit_type not in self.COMMIT_TYPES:
|
|
271
|
+
return False
|
|
272
|
+
|
|
273
|
+
# Check description is not empty
|
|
274
|
+
if not description:
|
|
275
|
+
return False
|
|
276
|
+
|
|
277
|
+
return True
|
|
278
|
+
|
|
279
|
+
def _format_changes_placeholder(self) -> str:
|
|
280
|
+
"""
|
|
281
|
+
Generate placeholder text for changes section.
|
|
282
|
+
|
|
283
|
+
Returns:
|
|
284
|
+
Formatted changes placeholder
|
|
285
|
+
"""
|
|
286
|
+
return """_Detailed changes will be visible in the diff. Key modifications:_
|
|
287
|
+
- [List specific instruction changes]
|
|
288
|
+
- [List frontmatter updates if any]
|
|
289
|
+
- [List any related file changes]"""
|
|
290
|
+
|
|
291
|
+
def generate_commit_message(
|
|
292
|
+
self,
|
|
293
|
+
item_name: str,
|
|
294
|
+
brief_description: str,
|
|
295
|
+
detailed_changes: str,
|
|
296
|
+
pr_type: PRType,
|
|
297
|
+
commit_type: str = "feat",
|
|
298
|
+
) -> str:
|
|
299
|
+
"""
|
|
300
|
+
Generate conventional commit message.
|
|
301
|
+
|
|
302
|
+
Args:
|
|
303
|
+
item_name: Agent or skill name
|
|
304
|
+
brief_description: Brief description
|
|
305
|
+
detailed_changes: Detailed list of changes
|
|
306
|
+
pr_type: Type (agent or skill)
|
|
307
|
+
commit_type: Conventional commit type
|
|
308
|
+
|
|
309
|
+
Returns:
|
|
310
|
+
Formatted commit message
|
|
311
|
+
|
|
312
|
+
Example:
|
|
313
|
+
>>> service = PRTemplateService()
|
|
314
|
+
>>> msg = service.generate_commit_message(
|
|
315
|
+
... "research",
|
|
316
|
+
... "improve memory efficiency",
|
|
317
|
+
... "- Add hard limit of 5 files\\n- Document MCP summarizer",
|
|
318
|
+
... PRType.AGENT
|
|
319
|
+
... )
|
|
320
|
+
"""
|
|
321
|
+
scope = pr_type.value
|
|
322
|
+
title = f"{commit_type}({scope}): improve {item_name} - {brief_description}"
|
|
323
|
+
|
|
324
|
+
return f"""{title}
|
|
325
|
+
|
|
326
|
+
{detailed_changes}
|
|
327
|
+
|
|
328
|
+
🤖 Generated with Claude MPM
|
|
329
|
+
"""
|