claude-mpm 4.21.3__py3-none-any.whl → 5.0.2__py3-none-any.whl

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