claude-mpm 4.24.0__py3-none-any.whl → 5.0.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.

Files changed (502) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +721 -911
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +4 -4
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +38 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +2 -6
  30. claude_mpm/cli/commands/config.py +7 -4
  31. claude_mpm/cli/commands/configure.py +769 -45
  32. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  33. claude_mpm/cli/commands/configure_navigation.py +63 -46
  34. claude_mpm/cli/commands/debug.py +12 -12
  35. claude_mpm/cli/commands/doctor.py +10 -2
  36. claude_mpm/cli/commands/hook_errors.py +277 -0
  37. claude_mpm/cli/commands/local_deploy.py +1 -4
  38. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  39. claude_mpm/cli/commands/mpm_init/core.py +49 -1
  40. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  41. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  42. claude_mpm/cli/commands/postmortem.py +401 -0
  43. claude_mpm/cli/commands/run.py +123 -165
  44. claude_mpm/cli/commands/skill_source.py +694 -0
  45. claude_mpm/cli/commands/skills.py +757 -20
  46. claude_mpm/cli/executor.py +78 -3
  47. claude_mpm/cli/interactive/agent_wizard.py +955 -45
  48. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  49. claude_mpm/cli/parsers/agents_parser.py +256 -4
  50. claude_mpm/cli/parsers/base_parser.py +53 -0
  51. claude_mpm/cli/parsers/config_parser.py +96 -43
  52. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  53. claude_mpm/cli/parsers/skills_parser.py +145 -0
  54. claude_mpm/cli/parsers/source_parser.py +138 -0
  55. claude_mpm/cli/startup.py +538 -106
  56. claude_mpm/cli/startup_display.py +480 -0
  57. claude_mpm/cli/utils.py +1 -1
  58. claude_mpm/cli_module/commands.py +1 -1
  59. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  60. claude_mpm/commands/mpm-agents-detect.md +9 -0
  61. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  62. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  63. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  64. claude_mpm/commands/mpm-doctor.md +9 -0
  65. claude_mpm/commands/mpm-help.md +14 -2
  66. claude_mpm/commands/mpm-init.md +27 -2
  67. claude_mpm/commands/mpm-monitor.md +9 -0
  68. claude_mpm/commands/mpm-postmortem.md +123 -0
  69. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  70. claude_mpm/commands/mpm-status.md +9 -0
  71. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  72. claude_mpm/commands/mpm-ticket-view.md +552 -0
  73. claude_mpm/commands/mpm-version.md +9 -0
  74. claude_mpm/commands/mpm.md +10 -0
  75. claude_mpm/config/agent_presets.py +488 -0
  76. claude_mpm/config/agent_sources.py +325 -0
  77. claude_mpm/config/skill_presets.py +392 -0
  78. claude_mpm/config/skill_sources.py +590 -0
  79. claude_mpm/constants.py +13 -0
  80. claude_mpm/core/claude_runner.py +5 -34
  81. claude_mpm/core/config.py +16 -0
  82. claude_mpm/core/constants.py +1 -1
  83. claude_mpm/core/framework/__init__.py +3 -16
  84. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  85. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  86. claude_mpm/core/hook_error_memory.py +381 -0
  87. claude_mpm/core/hook_manager.py +41 -2
  88. claude_mpm/core/interactive_session.py +91 -10
  89. claude_mpm/core/logger.py +3 -1
  90. claude_mpm/core/oneshot_session.py +71 -8
  91. claude_mpm/core/protocols/__init__.py +23 -0
  92. claude_mpm/core/protocols/runner_protocol.py +103 -0
  93. claude_mpm/core/protocols/session_protocol.py +131 -0
  94. claude_mpm/core/shared/singleton_manager.py +11 -4
  95. claude_mpm/core/system_context.py +38 -0
  96. claude_mpm/dashboard/static/css/activity.css +69 -69
  97. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  98. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  99. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  100. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  101. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  102. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  103. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  104. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  105. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  106. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  107. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  108. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  109. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  110. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  111. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  112. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  113. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  114. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  115. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  116. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  117. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  118. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  119. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  120. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  121. claude_mpm/dashboard/templates/code_simple.html +23 -23
  122. claude_mpm/dashboard/templates/index.html +18 -18
  123. claude_mpm/experimental/cli_enhancements.py +1 -5
  124. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  125. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  126. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  127. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  128. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  129. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  130. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  131. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  132. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  133. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  134. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  135. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  136. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  137. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  139. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  140. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  141. claude_mpm/models/git_repository.py +198 -0
  142. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  143. claude_mpm/scripts/start_activity_logging.py +3 -1
  144. claude_mpm/services/agents/agent_builder.py +45 -9
  145. claude_mpm/services/agents/agent_preset_service.py +238 -0
  146. claude_mpm/services/agents/agent_selection_service.py +484 -0
  147. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  148. claude_mpm/services/agents/cache_git_manager.py +621 -0
  149. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  150. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  151. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  152. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  153. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  154. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  155. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  156. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  157. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  158. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  159. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  160. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  161. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  162. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  163. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  164. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  165. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  166. claude_mpm/services/agents/git_source_manager.py +629 -0
  167. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  168. claude_mpm/services/agents/local_template_manager.py +50 -10
  169. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  170. claude_mpm/services/agents/sources/__init__.py +13 -0
  171. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  172. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  173. claude_mpm/services/agents/startup_sync.py +239 -0
  174. claude_mpm/services/agents/toolchain_detector.py +474 -0
  175. claude_mpm/services/analysis/__init__.py +25 -0
  176. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  177. claude_mpm/services/analysis/postmortem_service.py +765 -0
  178. claude_mpm/services/cli/session_pause_manager.py +1 -1
  179. claude_mpm/services/command_deployment_service.py +200 -6
  180. claude_mpm/services/core/base.py +7 -2
  181. claude_mpm/services/core/interfaces/__init__.py +1 -3
  182. claude_mpm/services/core/interfaces/health.py +1 -4
  183. claude_mpm/services/core/models/__init__.py +2 -11
  184. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  185. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  186. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  187. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  188. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  189. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  190. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  191. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  192. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  193. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  194. claude_mpm/services/event_bus/direct_relay.py +3 -3
  195. claude_mpm/services/events/consumers/logging.py +1 -2
  196. claude_mpm/services/git/__init__.py +21 -0
  197. claude_mpm/services/git/git_operations_service.py +494 -0
  198. claude_mpm/services/github/__init__.py +21 -0
  199. claude_mpm/services/github/github_cli_service.py +397 -0
  200. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  201. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  202. claude_mpm/services/instructions/__init__.py +9 -0
  203. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  204. claude_mpm/services/local_ops/__init__.py +3 -13
  205. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  206. claude_mpm/services/local_ops/health_manager.py +1 -4
  207. claude_mpm/services/local_ops/resource_monitor.py +1 -1
  208. claude_mpm/services/mcp_config_manager.py +75 -145
  209. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  210. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  211. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  212. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  213. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  214. claude_mpm/services/mcp_service_verifier.py +6 -3
  215. claude_mpm/services/model/model_router.py +1 -2
  216. claude_mpm/services/monitor/daemon.py +29 -9
  217. claude_mpm/services/monitor/daemon_manager.py +96 -19
  218. claude_mpm/services/monitor/server.py +2 -2
  219. claude_mpm/services/port_manager.py +1 -1
  220. claude_mpm/services/pr/__init__.py +14 -0
  221. claude_mpm/services/pr/pr_template_service.py +329 -0
  222. claude_mpm/services/project/documentation_manager.py +2 -1
  223. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  224. claude_mpm/services/runner_configuration_service.py +16 -3
  225. claude_mpm/services/session_management_service.py +16 -4
  226. claude_mpm/services/skills/__init__.py +18 -0
  227. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  228. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  229. claude_mpm/services/skills_config.py +547 -0
  230. claude_mpm/services/skills_deployer.py +955 -0
  231. claude_mpm/services/socketio/handlers/connection.py +1 -1
  232. claude_mpm/services/socketio/handlers/git.py +1 -1
  233. claude_mpm/services/socketio/server/core.py +1 -4
  234. claude_mpm/services/socketio/server/main.py +1 -3
  235. claude_mpm/services/system_instructions_service.py +1 -3
  236. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  237. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  238. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  239. claude_mpm/services/unified/unified_deployment.py +1 -5
  240. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  241. claude_mpm/services/visualization/__init__.py +1 -5
  242. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  243. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  244. claude_mpm/skills/skills_registry.py +0 -1
  245. claude_mpm/templates/questions/__init__.py +38 -0
  246. claude_mpm/templates/questions/base.py +193 -0
  247. claude_mpm/templates/questions/pr_strategy.py +311 -0
  248. claude_mpm/templates/questions/project_init.py +385 -0
  249. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  250. claude_mpm/tools/__main__.py +8 -8
  251. claude_mpm/utils/agent_dependency_loader.py +77 -10
  252. claude_mpm/utils/agent_filters.py +288 -0
  253. claude_mpm/utils/dependency_cache.py +3 -1
  254. claude_mpm/utils/gitignore.py +241 -0
  255. claude_mpm/utils/migration.py +372 -0
  256. claude_mpm/utils/progress.py +387 -0
  257. claude_mpm/utils/robust_installer.py +2 -4
  258. claude_mpm/utils/structured_questions.py +619 -0
  259. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/METADATA +396 -43
  260. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/RECORD +268 -422
  261. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  262. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  263. claude_mpm/agents/templates/agent-manager.json +0 -273
  264. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  265. claude_mpm/agents/templates/api_qa.json +0 -183
  266. claude_mpm/agents/templates/clerk-ops.json +0 -235
  267. claude_mpm/agents/templates/code_analyzer.json +0 -101
  268. claude_mpm/agents/templates/content-agent.json +0 -358
  269. claude_mpm/agents/templates/dart_engineer.json +0 -307
  270. claude_mpm/agents/templates/data_engineer.json +0 -225
  271. claude_mpm/agents/templates/documentation.json +0 -238
  272. claude_mpm/agents/templates/engineer.json +0 -210
  273. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  274. claude_mpm/agents/templates/golang_engineer.json +0 -270
  275. claude_mpm/agents/templates/imagemagick.json +0 -264
  276. claude_mpm/agents/templates/java_engineer.json +0 -346
  277. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  278. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  279. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  280. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  281. claude_mpm/agents/templates/memory_manager.json +0 -158
  282. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  283. claude_mpm/agents/templates/ops.json +0 -185
  284. claude_mpm/agents/templates/php-engineer.json +0 -287
  285. claude_mpm/agents/templates/product_owner.json +0 -338
  286. claude_mpm/agents/templates/project_organizer.json +0 -144
  287. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  288. claude_mpm/agents/templates/python_engineer.json +0 -387
  289. claude_mpm/agents/templates/qa.json +0 -243
  290. claude_mpm/agents/templates/react_engineer.json +0 -239
  291. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  292. claude_mpm/agents/templates/research.json +0 -188
  293. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  294. claude_mpm/agents/templates/rust_engineer.json +0 -275
  295. claude_mpm/agents/templates/security.json +0 -202
  296. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  297. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  298. claude_mpm/agents/templates/ticketing.json +0 -178
  299. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  300. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  301. claude_mpm/agents/templates/version_control.json +0 -159
  302. claude_mpm/agents/templates/web_qa.json +0 -400
  303. claude_mpm/agents/templates/web_ui.json +0 -189
  304. claude_mpm/commands/mpm-tickets.md +0 -151
  305. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  306. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  307. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  308. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  309. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  310. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  311. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  312. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  313. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  314. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  315. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  316. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  317. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  318. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  319. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  320. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  321. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  322. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  323. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  324. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  325. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  326. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  327. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  328. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  329. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  330. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  331. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  332. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  333. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  334. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  335. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  336. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  337. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  338. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  339. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  340. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  341. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  343. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  344. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  345. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  346. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  347. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  349. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  351. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  352. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  353. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  354. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  355. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  357. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  358. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  359. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  360. claude_mpm/dashboard/static/built/react/events.js +0 -30
  361. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  362. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  363. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  364. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  365. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  366. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  367. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  368. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  369. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  370. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  382. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  383. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  384. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  385. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  388. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  389. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  390. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  391. claude_mpm/dashboard/static/events.html +0 -607
  392. claude_mpm/dashboard/static/index.html +0 -635
  393. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  394. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  395. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  396. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  397. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  398. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  399. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  400. claude_mpm/dashboard/static/legacy/files.html +0 -747
  401. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  402. claude_mpm/dashboard/static/monitors.html +0 -431
  403. claude_mpm/dashboard/static/production/events.html +0 -659
  404. claude_mpm/dashboard/static/production/main.html +0 -698
  405. claude_mpm/dashboard/static/production/monitors.html +0 -483
  406. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  407. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  408. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  409. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  410. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  411. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  412. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  413. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  414. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  415. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  416. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  417. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  418. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  419. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  420. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  421. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  422. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  423. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  424. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  425. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  426. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  427. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  432. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  433. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  434. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  435. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  436. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  437. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  438. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  439. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  440. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  441. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  442. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  443. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  444. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  445. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  446. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  447. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  448. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  449. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  450. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  451. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  452. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  453. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  454. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  455. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  456. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  457. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  458. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  459. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  460. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  461. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  462. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  463. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  464. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  465. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  466. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  467. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  468. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  469. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  470. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  471. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  472. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  473. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  474. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  475. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  476. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  477. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  478. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  479. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  480. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  481. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  482. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  483. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  489. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  490. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  491. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  492. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  493. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  494. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  495. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  496. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  497. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  498. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  499. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
  500. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +0 -0
  501. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
  502. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.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
@@ -113,14 +113,10 @@ class AutoConfigureCommand(BaseCommand):
113
113
  def auto_config_manager(self) -> AutoConfigManagerService:
114
114
  """Get auto-configuration manager (lazy loaded)."""
115
115
  if self._auto_config_manager is None:
116
- from ...services.agents.auto_config_manager import (
117
- AutoConfigManagerService,
118
- )
116
+ from ...services.agents.auto_config_manager import AutoConfigManagerService
119
117
  from ...services.agents.recommender import AgentRecommenderService
120
118
  from ...services.agents.registry import AgentRegistry
121
- from ...services.project.toolchain_analyzer import (
122
- ToolchainAnalyzerService,
123
- )
119
+ from ...services.project.toolchain_analyzer import ToolchainAnalyzerService
124
120
 
125
121
  # Initialize services with dependency injection
126
122
  toolchain_analyzer = ToolchainAnalyzerService()
@@ -24,10 +24,7 @@ from rich.table import Table
24
24
  from ...core.config import Config
25
25
  from ...core.enums import OutputFormat
26
26
  from ...utils.console import console
27
- from ..shared import (
28
- BaseCommand,
29
- CommandResult,
30
- )
27
+ from ..shared import BaseCommand, CommandResult
31
28
 
32
29
 
33
30
  def _is_structured_output(args) -> bool:
@@ -457,6 +454,12 @@ class ConfigCommand(BaseCommand):
457
454
  def manage_config(args) -> int:
458
455
  """Main entry point for configuration management commands.
459
456
 
457
+ DEPRECATED: This function is no longer used by the CLI. The 'config' command
458
+ is now aliased to 'configure' and launches the interactive TUI. This function
459
+ is maintained for backward compatibility with MCP and other internal uses only.
460
+
461
+ Use manage_configure() instead for the interactive configuration interface.
462
+
460
463
  This function maintains backward compatibility while using the new BaseCommand pattern.
461
464
  """
462
465
  command = ConfigCommand()