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
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"""Agent cleanup command for syncing, installing, and removing old underscore-named agents.
|
|
2
|
+
|
|
3
|
+
WHY: After standardizing template filenames from underscores to dashes, users need
|
|
4
|
+
a way to sync the latest agents, install them with correct names, and remove old
|
|
5
|
+
underscore-named duplicates.
|
|
6
|
+
|
|
7
|
+
DESIGN DECISION: Three-phase cleanup process:
|
|
8
|
+
1. Sync agents from remote repository (download latest)
|
|
9
|
+
2. Deploy synced agents to target directory (force overwrite)
|
|
10
|
+
3. Remove old underscore-named agents that have dash equivalents
|
|
11
|
+
|
|
12
|
+
IMPLEMENTATION NOTE: Uses name similarity matching to identify old agents that
|
|
13
|
+
should be removed (e.g., python_engineer.md → python-engineer.md).
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import List
|
|
19
|
+
|
|
20
|
+
from ...config.agent_sources import AgentSourceConfiguration
|
|
21
|
+
from ...services.agents.sources.git_source_sync_service import GitSourceSyncService
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _normalize_agent_name(name: str) -> str:
|
|
27
|
+
"""Normalize agent name by removing extensions and converting to lowercase.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
name: Agent filename (e.g., "python_engineer.md" or "python-engineer.md")
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
Normalized name (e.g., "pythonengineer")
|
|
34
|
+
"""
|
|
35
|
+
# Remove file extension
|
|
36
|
+
name = name.replace(".md", "").replace(".json", "")
|
|
37
|
+
# Remove dashes and underscores for comparison
|
|
38
|
+
name = name.replace("-", "").replace("_", "")
|
|
39
|
+
return name.lower()
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _find_old_underscore_agents(
|
|
43
|
+
deployed_agents: List[Path], new_agents: List[str]
|
|
44
|
+
) -> List[Path]:
|
|
45
|
+
"""Find old underscore-named agents that have dash-named equivalents.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
deployed_agents: List of paths to deployed agent files
|
|
49
|
+
new_agents: List of new agent filenames (with dashes)
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
List of paths to old agents that should be removed
|
|
53
|
+
"""
|
|
54
|
+
# Normalize new agent names for comparison
|
|
55
|
+
normalized_new = {_normalize_agent_name(agent) for agent in new_agents}
|
|
56
|
+
|
|
57
|
+
old_agents = []
|
|
58
|
+
for agent_path in deployed_agents:
|
|
59
|
+
agent_name = agent_path.name
|
|
60
|
+
|
|
61
|
+
# Check if this is an underscore-named agent
|
|
62
|
+
if "_" in agent_name and "-" not in agent_name:
|
|
63
|
+
normalized = _normalize_agent_name(agent_name)
|
|
64
|
+
|
|
65
|
+
# If we have a dash-named equivalent, mark for removal
|
|
66
|
+
if normalized in normalized_new:
|
|
67
|
+
old_agents.append(agent_path)
|
|
68
|
+
|
|
69
|
+
return old_agents
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def handle_agents_cleanup(args) -> int:
|
|
73
|
+
"""Handle the 'claude-mpm agents cleanup' command.
|
|
74
|
+
|
|
75
|
+
This command performs a complete agent cleanup:
|
|
76
|
+
1. Syncs agents from remote repository
|
|
77
|
+
2. Deploys agents with new naming convention (force overwrite)
|
|
78
|
+
3. Removes old underscore-named agents that have dash equivalents
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
args: Parsed command-line arguments with:
|
|
82
|
+
- dry_run: Show what would be done without doing it
|
|
83
|
+
- target: Target directory for deployment
|
|
84
|
+
- global_deployment: Deploy to global ~/.claude/agents/
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
Exit code (0 for success, 1 for error)
|
|
88
|
+
"""
|
|
89
|
+
try:
|
|
90
|
+
dry_run = args.dry_run
|
|
91
|
+
|
|
92
|
+
# Determine target directory
|
|
93
|
+
if args.global_deployment:
|
|
94
|
+
target_dir = Path.home() / ".claude" / "agents"
|
|
95
|
+
elif args.target:
|
|
96
|
+
target_dir = args.target
|
|
97
|
+
else:
|
|
98
|
+
target_dir = Path.cwd() / ".claude-mpm" / "agents"
|
|
99
|
+
|
|
100
|
+
print("\n🧹 Agent Cleanup")
|
|
101
|
+
print(f"{'=' * 60}")
|
|
102
|
+
|
|
103
|
+
if dry_run:
|
|
104
|
+
print("🔍 DRY RUN MODE - No changes will be made\n")
|
|
105
|
+
|
|
106
|
+
# Phase 1: Sync agents from remote
|
|
107
|
+
print("📥 Phase 1: Syncing agents from remote repository...")
|
|
108
|
+
|
|
109
|
+
config = AgentSourceConfiguration.load()
|
|
110
|
+
repositories = config.get_enabled_repositories()
|
|
111
|
+
|
|
112
|
+
if not repositories:
|
|
113
|
+
print(
|
|
114
|
+
"⚠️ No agent sources configured. Run 'claude-mpm agent-source add' first."
|
|
115
|
+
)
|
|
116
|
+
return 1
|
|
117
|
+
|
|
118
|
+
sync_service = GitSourceSyncService()
|
|
119
|
+
synced_count = 0
|
|
120
|
+
|
|
121
|
+
for repo in repositories:
|
|
122
|
+
print(f" Syncing from {repo.url}...")
|
|
123
|
+
try:
|
|
124
|
+
result = sync_service.sync_agents(show_progress=False)
|
|
125
|
+
synced_count += result.get("total_downloaded", 0)
|
|
126
|
+
print(f" ✓ Synced {result.get('total_downloaded', 0)} agents")
|
|
127
|
+
except Exception as e:
|
|
128
|
+
print(f" ✗ Failed to sync: {e}")
|
|
129
|
+
continue
|
|
130
|
+
|
|
131
|
+
if synced_count == 0:
|
|
132
|
+
print(
|
|
133
|
+
"⚠️ No agents synced. Check your network connection or agent sources."
|
|
134
|
+
)
|
|
135
|
+
return 1
|
|
136
|
+
|
|
137
|
+
print(f"\n✓ Synced {synced_count} agents total")
|
|
138
|
+
|
|
139
|
+
# Phase 2: Deploy agents (force overwrite)
|
|
140
|
+
print(f"\n📦 Phase 2: Deploying agents to {target_dir}...")
|
|
141
|
+
|
|
142
|
+
if not dry_run:
|
|
143
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
144
|
+
|
|
145
|
+
# Get list of agents from cache
|
|
146
|
+
cache_dir = sync_service.get_cached_agents_dir()
|
|
147
|
+
cached_agents = list(cache_dir.glob("*.md"))
|
|
148
|
+
new_agent_names = [agent.name for agent in cached_agents]
|
|
149
|
+
|
|
150
|
+
if not dry_run:
|
|
151
|
+
result = sync_service.deploy_agents_to_project(Path.cwd(), force=True)
|
|
152
|
+
deployed_count = len(result.get("deployed", [])) + len(
|
|
153
|
+
result.get("updated", [])
|
|
154
|
+
)
|
|
155
|
+
print(f"✓ Deployed {deployed_count} agents")
|
|
156
|
+
else:
|
|
157
|
+
print(f" Would deploy {len(cached_agents)} agents:")
|
|
158
|
+
for agent in cached_agents[:10]: # Show first 10
|
|
159
|
+
print(f" - {agent.name}")
|
|
160
|
+
if len(cached_agents) > 10:
|
|
161
|
+
print(f" ... and {len(cached_agents) - 10} more")
|
|
162
|
+
|
|
163
|
+
# Phase 3: Remove old underscore-named agents
|
|
164
|
+
print("\n🗑️ Phase 3: Removing old underscore-named agents...")
|
|
165
|
+
|
|
166
|
+
# Find deployed agents
|
|
167
|
+
deployed_agents = list(target_dir.glob("*.md"))
|
|
168
|
+
old_agents = _find_old_underscore_agents(deployed_agents, new_agent_names)
|
|
169
|
+
|
|
170
|
+
if not old_agents:
|
|
171
|
+
print("✓ No old underscore-named agents found")
|
|
172
|
+
else:
|
|
173
|
+
print(f" Found {len(old_agents)} old agents to remove:")
|
|
174
|
+
for agent in old_agents:
|
|
175
|
+
# Find the new equivalent name
|
|
176
|
+
normalized = _normalize_agent_name(agent.name)
|
|
177
|
+
dash_equiv = [
|
|
178
|
+
name
|
|
179
|
+
for name in new_agent_names
|
|
180
|
+
if _normalize_agent_name(name) == normalized
|
|
181
|
+
]
|
|
182
|
+
equiv_str = f" → {dash_equiv[0]}" if dash_equiv else ""
|
|
183
|
+
|
|
184
|
+
print(f" - {agent.name}{equiv_str}")
|
|
185
|
+
|
|
186
|
+
if not dry_run:
|
|
187
|
+
agent.unlink()
|
|
188
|
+
|
|
189
|
+
if not dry_run:
|
|
190
|
+
print(f"✓ Removed {len(old_agents)} old agents")
|
|
191
|
+
else:
|
|
192
|
+
print(f" Would remove {len(old_agents)} old agents")
|
|
193
|
+
|
|
194
|
+
# Summary
|
|
195
|
+
print(f"\n{'=' * 60}")
|
|
196
|
+
print("✅ Cleanup complete!")
|
|
197
|
+
print("\nSummary:")
|
|
198
|
+
print(f" • Synced: {synced_count} agents")
|
|
199
|
+
print(f" • Deployed: {len(cached_agents)} agents")
|
|
200
|
+
print(f" • Removed: {len(old_agents)} old agents")
|
|
201
|
+
|
|
202
|
+
if dry_run:
|
|
203
|
+
print("\n💡 Run without --dry-run to apply changes")
|
|
204
|
+
|
|
205
|
+
return 0
|
|
206
|
+
|
|
207
|
+
except Exception as e:
|
|
208
|
+
logger.exception("Agent cleanup failed")
|
|
209
|
+
print(f"\n❌ Error: {e}")
|
|
210
|
+
return 1
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"""Agent discovery command for browsing available agents from configured sources.
|
|
2
|
+
|
|
3
|
+
WHY: This module implements the 'agents discover' command, allowing users to
|
|
4
|
+
browse and filter agents from configured Git sources. Provides rich filtering
|
|
5
|
+
by category, language, framework, platform, and specialization.
|
|
6
|
+
|
|
7
|
+
DESIGN DECISION: Rich console output using rich library
|
|
8
|
+
|
|
9
|
+
Rationale: Users need beautiful, informative output when discovering agents.
|
|
10
|
+
The rich library (already a dependency) provides excellent table formatting,
|
|
11
|
+
color support, and tree views.
|
|
12
|
+
|
|
13
|
+
Trade-offs:
|
|
14
|
+
- User Experience: Beautiful output improves discoverability
|
|
15
|
+
- Complexity: Rich table formatting adds some code overhead
|
|
16
|
+
- Performance: Rendering is fast enough for CLI use (<50ms)
|
|
17
|
+
|
|
18
|
+
Example Usage:
|
|
19
|
+
>>> claude-mpm agents discover --category engineer/backend
|
|
20
|
+
>>> claude-mpm agents discover --language python --verbose
|
|
21
|
+
>>> claude-mpm agents discover --framework react --format json
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import json
|
|
25
|
+
import logging
|
|
26
|
+
from typing import Any, Dict, List
|
|
27
|
+
|
|
28
|
+
from rich.console import Console
|
|
29
|
+
|
|
30
|
+
from ...config.agent_sources import AgentSourceConfiguration
|
|
31
|
+
from ...services.agents.git_source_manager import GitSourceManager
|
|
32
|
+
|
|
33
|
+
logger = logging.getLogger(__name__)
|
|
34
|
+
console = Console()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _group_agents_by_category(
|
|
38
|
+
agents: List[Dict[str, Any]],
|
|
39
|
+
) -> Dict[str, List[Dict[str, Any]]]:
|
|
40
|
+
"""Group agents by their category for organized display.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
agents: List of agent dictionaries
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
Dictionary mapping category names to lists of agents
|
|
47
|
+
|
|
48
|
+
Example:
|
|
49
|
+
>>> agents = [
|
|
50
|
+
... {"agent_id": "engineer/backend/python-engineer", "category": "engineer/backend"},
|
|
51
|
+
... {"agent_id": "qa/qa", "category": "qa"}
|
|
52
|
+
... ]
|
|
53
|
+
>>> grouped = _group_agents_by_category(agents)
|
|
54
|
+
>>> grouped.keys()
|
|
55
|
+
dict_keys(['engineer/backend', 'qa'])
|
|
56
|
+
"""
|
|
57
|
+
grouped: Dict[str, List[Dict[str, Any]]] = {}
|
|
58
|
+
|
|
59
|
+
for agent in agents:
|
|
60
|
+
# Extract category from agent_id if not present
|
|
61
|
+
category = agent.get("category", "unknown")
|
|
62
|
+
|
|
63
|
+
if category == "unknown" and "agent_id" in agent:
|
|
64
|
+
agent_id = agent["agent_id"]
|
|
65
|
+
if "/" in agent_id:
|
|
66
|
+
category = agent_id.rsplit("/", 1)[0]
|
|
67
|
+
|
|
68
|
+
if category not in grouped:
|
|
69
|
+
grouped[category] = []
|
|
70
|
+
|
|
71
|
+
grouped[category].append(agent)
|
|
72
|
+
|
|
73
|
+
return grouped
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _format_category_name(category: str) -> str:
|
|
77
|
+
"""Format category name for display.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
category: Raw category string (e.g., "engineer/backend")
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
Formatted category name (e.g., "Engineering/Backend")
|
|
84
|
+
|
|
85
|
+
Example:
|
|
86
|
+
>>> _format_category_name("engineer/backend")
|
|
87
|
+
'Engineering/Backend'
|
|
88
|
+
>>> _format_category_name("qa")
|
|
89
|
+
'QA'
|
|
90
|
+
"""
|
|
91
|
+
# Special cases
|
|
92
|
+
if category == "qa":
|
|
93
|
+
return "QA"
|
|
94
|
+
if category == "ops":
|
|
95
|
+
return "Ops"
|
|
96
|
+
|
|
97
|
+
# Capitalize each part
|
|
98
|
+
parts = category.split("/")
|
|
99
|
+
formatted_parts = []
|
|
100
|
+
|
|
101
|
+
for part in parts:
|
|
102
|
+
if part == "qa":
|
|
103
|
+
formatted_parts.append("QA")
|
|
104
|
+
elif part == "ops":
|
|
105
|
+
formatted_parts.append("Ops")
|
|
106
|
+
else:
|
|
107
|
+
formatted_parts.append(part.capitalize())
|
|
108
|
+
|
|
109
|
+
return "/".join(formatted_parts)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _output_table_format(agents: List[Dict[str, Any]], verbose: bool = False) -> None:
|
|
113
|
+
"""Output agents in rich table format (default).
|
|
114
|
+
|
|
115
|
+
Design Decision: Group by category for better organization
|
|
116
|
+
|
|
117
|
+
Rationale: Agents grouped by category (engineer/backend, qa, ops) are
|
|
118
|
+
easier to scan than a flat list. Categories provide context about
|
|
119
|
+
agent purpose.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
agents: List of agent dictionaries
|
|
123
|
+
verbose: Show descriptions and metadata
|
|
124
|
+
"""
|
|
125
|
+
if not agents:
|
|
126
|
+
console.print("[yellow]No agents found matching filters.[/yellow]")
|
|
127
|
+
return
|
|
128
|
+
|
|
129
|
+
console.print(
|
|
130
|
+
f"\n[bold]📚 Agents from configured sources ({len(agents)} matching filters):[/bold]\n"
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
# Group by category
|
|
134
|
+
grouped = _group_agents_by_category(agents)
|
|
135
|
+
|
|
136
|
+
# Sort categories for consistent display
|
|
137
|
+
sorted_categories = sorted(grouped.keys())
|
|
138
|
+
|
|
139
|
+
for category in sorted_categories:
|
|
140
|
+
category_agents = grouped[category]
|
|
141
|
+
|
|
142
|
+
# Print category header
|
|
143
|
+
formatted_category = _format_category_name(category)
|
|
144
|
+
console.print(f"[bold cyan]{formatted_category}[/bold cyan]")
|
|
145
|
+
|
|
146
|
+
# Print agents in this category
|
|
147
|
+
for agent in sorted(category_agents, key=lambda a: a.get("agent_id", "")):
|
|
148
|
+
agent_id = agent.get("agent_id", "unknown")
|
|
149
|
+
source = agent.get("source", agent.get("repository", "unknown"))
|
|
150
|
+
priority = agent.get("priority", "unknown")
|
|
151
|
+
|
|
152
|
+
# Agent ID line
|
|
153
|
+
console.print(f" • [bold]{agent_id}[/bold]")
|
|
154
|
+
|
|
155
|
+
if verbose:
|
|
156
|
+
# Description
|
|
157
|
+
description = agent.get("metadata", {}).get("description", "")
|
|
158
|
+
if not description:
|
|
159
|
+
description = agent.get("description", "No description available")
|
|
160
|
+
|
|
161
|
+
console.print(f" {description}")
|
|
162
|
+
|
|
163
|
+
# Version
|
|
164
|
+
version = agent.get(
|
|
165
|
+
"version", agent.get("metadata", {}).get("version", "unknown")
|
|
166
|
+
)
|
|
167
|
+
console.print(f" Version: {version}")
|
|
168
|
+
|
|
169
|
+
# Source attribution
|
|
170
|
+
console.print(f" Source: [dim]{source}[/dim] (priority: {priority})")
|
|
171
|
+
|
|
172
|
+
console.print() # Blank line between agents
|
|
173
|
+
|
|
174
|
+
console.print() # Blank line between categories
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _output_json_format(
|
|
178
|
+
agents: List[Dict[str, Any]], filters_applied: Dict[str, str]
|
|
179
|
+
) -> None:
|
|
180
|
+
"""Output agents in JSON format for scripting.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
agents: List of agent dictionaries
|
|
184
|
+
filters_applied: Dictionary of filters that were applied
|
|
185
|
+
"""
|
|
186
|
+
output = {
|
|
187
|
+
"total": len(agents),
|
|
188
|
+
"filters_applied": filters_applied,
|
|
189
|
+
"agents": [
|
|
190
|
+
{
|
|
191
|
+
"agent_id": agent.get("agent_id", "unknown"),
|
|
192
|
+
"source": agent.get("source", agent.get("repository", "unknown")),
|
|
193
|
+
"priority": agent.get("priority", "unknown"),
|
|
194
|
+
"category": agent.get("category", "unknown"),
|
|
195
|
+
"version": agent.get(
|
|
196
|
+
"version", agent.get("metadata", {}).get("version", "unknown")
|
|
197
|
+
),
|
|
198
|
+
"description": agent.get("metadata", {}).get(
|
|
199
|
+
"description", agent.get("description", "")
|
|
200
|
+
),
|
|
201
|
+
}
|
|
202
|
+
for agent in agents
|
|
203
|
+
],
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
console.print(json.dumps(output, indent=2))
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _output_simple_format(agents: List[Dict[str, Any]]) -> None:
|
|
210
|
+
"""Output agents in simple format (agent IDs only).
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
agents: List of agent dictionaries
|
|
214
|
+
"""
|
|
215
|
+
for agent in sorted(agents, key=lambda a: a.get("agent_id", "")):
|
|
216
|
+
agent_id = agent.get("agent_id", "unknown")
|
|
217
|
+
console.print(agent_id)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def discover_command(args) -> int:
|
|
221
|
+
"""Execute the 'agents discover' command.
|
|
222
|
+
|
|
223
|
+
This command discovers and lists available agents from all configured
|
|
224
|
+
Git sources, with optional filtering by category, language, framework,
|
|
225
|
+
platform, and source.
|
|
226
|
+
|
|
227
|
+
Design Decision: Load sources from configuration
|
|
228
|
+
|
|
229
|
+
Rationale: Use AgentSourceConfiguration to load all configured sources,
|
|
230
|
+
respecting enabled/disabled state and priority. This ensures consistent
|
|
231
|
+
behavior with other agent commands.
|
|
232
|
+
|
|
233
|
+
Error Handling:
|
|
234
|
+
- Graceful degradation if no sources configured
|
|
235
|
+
- Warning if cache not populated (suggest agent-source update)
|
|
236
|
+
- Empty result sets clearly communicated
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
args: Parsed command arguments with attributes:
|
|
240
|
+
- source: Optional source ID filter
|
|
241
|
+
- category: Optional category filter
|
|
242
|
+
- language: Optional language filter
|
|
243
|
+
- framework: Optional framework filter
|
|
244
|
+
- platform: Optional platform filter
|
|
245
|
+
- specialization: Optional specialization filter
|
|
246
|
+
- format: Output format (table, json, simple)
|
|
247
|
+
- verbose: Show descriptions and metadata
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Exit code (0 for success, 1 for error)
|
|
251
|
+
|
|
252
|
+
Example:
|
|
253
|
+
>>> args = argparse.Namespace(
|
|
254
|
+
... source=None,
|
|
255
|
+
... category="engineer/backend",
|
|
256
|
+
... language=None,
|
|
257
|
+
... framework=None,
|
|
258
|
+
... platform=None,
|
|
259
|
+
... specialization=None,
|
|
260
|
+
... format="table",
|
|
261
|
+
... verbose=False
|
|
262
|
+
... )
|
|
263
|
+
>>> discover_command(args)
|
|
264
|
+
0
|
|
265
|
+
"""
|
|
266
|
+
try:
|
|
267
|
+
# Load agent sources configuration
|
|
268
|
+
sources_config = AgentSourceConfiguration()
|
|
269
|
+
|
|
270
|
+
# Initialize Git source manager
|
|
271
|
+
manager = GitSourceManager()
|
|
272
|
+
|
|
273
|
+
# Build filters dictionary
|
|
274
|
+
filters = {}
|
|
275
|
+
|
|
276
|
+
if args.category:
|
|
277
|
+
filters["category"] = args.category
|
|
278
|
+
|
|
279
|
+
if args.language:
|
|
280
|
+
filters["language"] = args.language
|
|
281
|
+
|
|
282
|
+
if args.framework:
|
|
283
|
+
filters["framework"] = args.framework
|
|
284
|
+
|
|
285
|
+
if args.platform:
|
|
286
|
+
filters["platform"] = args.platform
|
|
287
|
+
|
|
288
|
+
if args.specialization:
|
|
289
|
+
filters["specialization"] = args.specialization
|
|
290
|
+
|
|
291
|
+
# Get agents with filters
|
|
292
|
+
agents = manager.list_cached_agents_with_filters(
|
|
293
|
+
repo_identifier=args.source, filters=filters if filters else None
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
# Check if any sources are configured
|
|
297
|
+
if not agents and not sources_config.list_sources():
|
|
298
|
+
console.print("[yellow]⚠️ No agent sources configured.[/yellow]")
|
|
299
|
+
console.print("\nAdd a source with:")
|
|
300
|
+
console.print(" claude-mpm agent-source add <git-url>")
|
|
301
|
+
return 1
|
|
302
|
+
|
|
303
|
+
# Check if cache might be empty
|
|
304
|
+
if not agents and not filters:
|
|
305
|
+
console.print("[yellow]⚠️ No agents found in cache.[/yellow]")
|
|
306
|
+
console.print("\nTry syncing sources first:")
|
|
307
|
+
console.print(" claude-mpm agent-source update")
|
|
308
|
+
return 1
|
|
309
|
+
|
|
310
|
+
# Output based on format
|
|
311
|
+
if args.format == "json":
|
|
312
|
+
filters_applied = {
|
|
313
|
+
k: v
|
|
314
|
+
for k, v in [
|
|
315
|
+
("source", args.source),
|
|
316
|
+
("category", args.category),
|
|
317
|
+
("language", args.language),
|
|
318
|
+
("framework", args.framework),
|
|
319
|
+
("platform", args.platform),
|
|
320
|
+
("specialization", args.specialization),
|
|
321
|
+
]
|
|
322
|
+
if v is not None
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
_output_json_format(agents, filters_applied)
|
|
326
|
+
|
|
327
|
+
elif args.format == "simple":
|
|
328
|
+
_output_simple_format(agents)
|
|
329
|
+
|
|
330
|
+
else: # table (default)
|
|
331
|
+
_output_table_format(agents, verbose=args.verbose)
|
|
332
|
+
|
|
333
|
+
return 0
|
|
334
|
+
|
|
335
|
+
except Exception as e:
|
|
336
|
+
logger.error(f"Error discovering agents: {e}", exc_info=True)
|
|
337
|
+
console.print(f"[bold red]Error:[/bold red] {e}")
|
|
338
|
+
return 1
|
|
@@ -365,7 +365,7 @@ def view_command_legacy(args):
|
|
|
365
365
|
print(f" Tools: {len(delegation.tool_operations)}")
|
|
366
366
|
print(f" Files: {len(delegation.file_changes)}")
|
|
367
367
|
if delegation.duration_ms:
|
|
368
|
-
print(f" Duration: {delegation.duration_ms/1000:.1f}s")
|
|
368
|
+
print(f" Duration: {delegation.duration_ms / 1000:.1f}s")
|
|
369
369
|
print(f" Status: {'✅ Success' if delegation.success else '❌ Failed'}")
|
|
370
370
|
if delegation.error:
|
|
371
371
|
print(f" Error: {delegation.error}")
|
|
@@ -350,7 +350,7 @@ class AnalyzeCommand(BaseCommand):
|
|
|
350
350
|
|
|
351
351
|
for i, match in enumerate(matches):
|
|
352
352
|
# Try to extract title from preceding line
|
|
353
|
-
title = f"diagram_{i+1}"
|
|
353
|
+
title = f"diagram_{i + 1}"
|
|
354
354
|
|
|
355
355
|
# Look for a title pattern before the diagram
|
|
356
356
|
title_pattern = r"(?:#+\s*)?([^\n]+)\n+```mermaid"
|
|
@@ -456,7 +456,7 @@ class AnalyzeCommand(BaseCommand):
|
|
|
456
456
|
return output
|
|
457
457
|
|
|
458
458
|
# text format
|
|
459
|
-
output = f"Code Analysis Report\n{'='*50}\n\n"
|
|
459
|
+
output = f"Code Analysis Report\n{'=' * 50}\n\n"
|
|
460
460
|
output += f"Target: {result_data['target']}\n"
|
|
461
461
|
|
|
462
462
|
if diagrams:
|
|
@@ -469,7 +469,7 @@ class AnalyzeCommand(BaseCommand):
|
|
|
469
469
|
for filepath in result_data["saved_diagrams"]:
|
|
470
470
|
output += f" • {filepath}\n"
|
|
471
471
|
|
|
472
|
-
output += f"\n{'-'*50}\nAnalysis Results:\n{'-'*50}\n"
|
|
472
|
+
output += f"\n{'-' * 50}\nAnalysis Results:\n{'-' * 50}\n"
|
|
473
473
|
output += result_data.get("analysis", "No analysis results")
|
|
474
474
|
|
|
475
475
|
return output
|