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
@@ -21,11 +21,9 @@ from ...services.cli.agent_dependency_service import AgentDependencyService
21
21
  from ...services.cli.agent_listing_service import AgentListingService
22
22
  from ...services.cli.agent_output_formatter import AgentOutputFormatter
23
23
  from ...services.cli.agent_validation_service import AgentValidationService
24
- from ..shared import (
25
- AgentCommand,
26
- CommandResult,
27
- )
24
+ from ..shared import AgentCommand, CommandResult
28
25
  from ..utils import get_agent_versions_display
26
+ from .agents_cleanup import handle_agents_cleanup
29
27
 
30
28
 
31
29
  def _is_structured_output(args) -> bool:
@@ -149,6 +147,7 @@ class AgentsCommand(AgentCommand):
149
147
  "deps-install": self._install_agent_dependencies,
150
148
  "deps-list": self._list_agent_dependencies,
151
149
  "deps-fix": self._fix_agent_dependencies,
150
+ "cleanup": lambda a: self._handle_cleanup_command(a),
152
151
  "cleanup-orphaned": self._cleanup_orphaned_agents,
153
152
  # Local agent management commands
154
153
  "create": self._create_local_agent,
@@ -156,9 +155,18 @@ class AgentsCommand(AgentCommand):
156
155
  "delete": self._delete_local_agent,
157
156
  "manage": self._manage_local_agents,
158
157
  "configure": self._configure_deployment,
158
+ # Migration command (DEPRECATION support)
159
+ "migrate-to-project": self._migrate_to_project,
159
160
  # Auto-configuration commands (TSK-0054 Phase 5)
160
161
  "detect": self._detect_toolchain,
161
162
  "recommend": self._recommend_agents,
163
+ # Agent selection modes (Phase 3: 1M-382)
164
+ "deploy-minimal": self._deploy_minimal_configuration,
165
+ "deploy-auto": self._deploy_auto_configure,
166
+ # Agent source management (Phase 2: 1M-442)
167
+ "available": self._list_available_from_sources,
168
+ # Agent discovery with rich filtering (Phase 1: Discovery & Browsing)
169
+ "discover": self._discover_agents,
162
170
  }
163
171
 
164
172
  if args.agents_command in command_map:
@@ -396,9 +404,159 @@ class AgentsCommand(AgentCommand):
396
404
  self.logger.error(f"Error listing agents by tier: {e}", exc_info=True)
397
405
  return CommandResult.error_result(f"Error listing agents by tier: {e}")
398
406
 
407
+ def _list_available_from_sources(self, args) -> CommandResult:
408
+ """List available agents from all configured git sources.
409
+
410
+ This command shows agents discovered from configured agent sources
411
+ (Git repositories) after syncing their cache. Implements Phase 2 of 1M-442.
412
+
413
+ Args:
414
+ args: Command arguments with optional source filter and format
415
+
416
+ Returns:
417
+ CommandResult with agent list or error
418
+ """
419
+ try:
420
+ from ...config.agent_sources import AgentSourceConfiguration
421
+ from ...services.agents.git_source_manager import GitSourceManager
422
+
423
+ # Load agent sources configuration
424
+ config = AgentSourceConfiguration.load()
425
+ enabled_repos = [r for r in config.repositories if r.enabled]
426
+
427
+ if not enabled_repos:
428
+ message = (
429
+ "No agent sources configured.\n\n"
430
+ "Configure sources with:\n"
431
+ " claude-mpm agent-source add <url>\n\n"
432
+ "Example:\n"
433
+ " claude-mpm agent-source add https://github.com/owner/repo/agents"
434
+ )
435
+ print(message)
436
+ return CommandResult.error_result("No agent sources configured")
437
+
438
+ # Initialize git source manager
439
+ manager = GitSourceManager()
440
+
441
+ # Sync all configured sources (with timeout)
442
+ self.logger.info(f"Syncing {len(enabled_repos)} agent sources...")
443
+ sync_results = {}
444
+
445
+ for repo in enabled_repos:
446
+ try:
447
+ result = manager.sync_repository(repo, force=False)
448
+ sync_results[repo.identifier] = result
449
+ except Exception as e:
450
+ self.logger.warning(f"Failed to sync {repo.identifier}: {e}")
451
+ sync_results[repo.identifier] = {"synced": False, "error": str(e)}
452
+
453
+ # Get source filter from args
454
+ source_filter = getattr(args, "source", None)
455
+
456
+ # List all cached agents
457
+ all_agents = manager.list_cached_agents(repo_identifier=source_filter)
458
+
459
+ if not all_agents:
460
+ message = "No agents found in configured sources."
461
+ if sync_results:
462
+ failed_count = sum(
463
+ 1 for r in sync_results.values() if not r.get("synced")
464
+ )
465
+ if failed_count > 0:
466
+ message += f"\n\n{failed_count} source(s) failed to sync. Check logs for details."
467
+ print(message)
468
+ return CommandResult.success_result(message, data={"agents": []})
469
+
470
+ # Format output
471
+ output_format = getattr(args, "format", "table")
472
+
473
+ if output_format == "json":
474
+ import json
475
+
476
+ print(json.dumps(all_agents, indent=2))
477
+ elif output_format == "simple":
478
+ for agent in all_agents:
479
+ name = agent.get("metadata", {}).get(
480
+ "name", agent.get("agent_id", "unknown")
481
+ )
482
+ repo = agent.get("repository", "unknown")
483
+ print(f"{name} (from {repo})")
484
+ else: # table format
485
+ print(f"\n{'Agent Name':<30} {'Repository':<40} {'Version':<15}")
486
+ print("=" * 85)
487
+ for agent in all_agents:
488
+ name = agent.get("metadata", {}).get(
489
+ "name", agent.get("agent_id", "unknown")
490
+ )
491
+ repo = agent.get("repository", "unknown")
492
+ version = agent.get("version", "unknown")[:12]
493
+ print(f"{name:<30} {repo:<40} {version:<15}")
494
+ print(
495
+ f"\nTotal: {len(all_agents)} agents from {len(sync_results)} sources"
496
+ )
497
+
498
+ return CommandResult.success_result(
499
+ f"Listed {len(all_agents)} agents from sources",
500
+ data={"agents": all_agents, "sync_results": sync_results},
501
+ )
502
+
503
+ except Exception as e:
504
+ self.logger.error(f"Error listing available agents: {e}", exc_info=True)
505
+ return CommandResult.error_result(f"Error listing available agents: {e}")
506
+
507
+ def _discover_agents(self, args) -> CommandResult:
508
+ """Discover agents with rich filtering capabilities.
509
+
510
+ This command extends the 'available' command by adding semantic filtering
511
+ based on AUTO-DEPLOY-INDEX.md categories. Users can filter by category,
512
+ language, framework, platform, and specialization.
513
+
514
+ Design Decision: Delegate to agents_discover.py module
515
+
516
+ Rationale: Keep CLI command logic separate from routing logic for better
517
+ testability and maintainability. The discover_command function handles
518
+ all the complex filtering and formatting logic.
519
+
520
+ Args:
521
+ args: Command arguments with filter options:
522
+ - source: Source repository filter
523
+ - category: Category filter (e.g., 'engineer/backend')
524
+ - language: Language filter (e.g., 'python')
525
+ - framework: Framework filter (e.g., 'react')
526
+ - platform: Platform filter (e.g., 'vercel')
527
+ - specialization: Specialization filter (e.g., 'data')
528
+ - format: Output format (table, json, simple)
529
+ - verbose: Show descriptions and metadata
530
+
531
+ Returns:
532
+ CommandResult with filtered agent list or error
533
+
534
+ Example:
535
+ >>> # Called via: claude-mpm agents discover --category engineer/backend
536
+ >>> _discover_agents(args)
537
+ CommandResult(success=True, message="Discovered 8 agents")
538
+ """
539
+ try:
540
+ from .agents_discover import discover_command
541
+
542
+ # Call discover_command and convert exit code to CommandResult
543
+ exit_code = discover_command(args)
544
+
545
+ if exit_code == 0:
546
+ return CommandResult.success_result("Agent discovery complete")
547
+ return CommandResult.error_result("Agent discovery failed")
548
+
549
+ except Exception as e:
550
+ self.logger.error(f"Error discovering agents: {e}", exc_info=True)
551
+ return CommandResult.error_result(f"Error discovering agents: {e}")
552
+
399
553
  def _deploy_agents(self, args, force=False) -> CommandResult:
400
- """Deploy both system and project agents."""
554
+ """Deploy both system and project agents, or deploy by preset."""
401
555
  try:
556
+ # Handle preset deployment
557
+ if hasattr(args, "preset") and args.preset:
558
+ return self._deploy_preset(args)
559
+
402
560
  # Deploy system agents
403
561
  system_result = self.deployment_service.deploy_system_agents(force=force)
404
562
 
@@ -444,6 +602,173 @@ class AgentsCommand(AgentCommand):
444
602
  self.logger.error(f"Error deploying agents: {e}", exc_info=True)
445
603
  return CommandResult.error_result(f"Error deploying agents: {e}")
446
604
 
605
+ def _deploy_preset(self, args) -> CommandResult:
606
+ """Deploy agents by preset name.
607
+
608
+ This method implements Phase 2 of the agents/skills CLI redesign,
609
+ enabling preset-based deployment like:
610
+ claude-mpm agents deploy --preset python-dev
611
+
612
+ Args:
613
+ args: Command arguments with preset name and optional flags
614
+
615
+ Returns:
616
+ CommandResult with deployment status
617
+ """
618
+ try:
619
+ from pathlib import Path
620
+
621
+ from ...config.agent_sources import AgentSourceConfiguration
622
+ from ...services.agents.agent_preset_service import AgentPresetService
623
+ from ...services.agents.git_source_manager import GitSourceManager
624
+ from ...services.agents.single_tier_deployment_service import (
625
+ SingleTierDeploymentService,
626
+ )
627
+
628
+ preset_name = args.preset
629
+ dry_run = getattr(args, "dry_run", False)
630
+
631
+ # Initialize services
632
+ config = AgentSourceConfiguration.load()
633
+ deployment_dir = Path.home() / ".claude" / "agents"
634
+ git_source_manager = GitSourceManager()
635
+ preset_service = AgentPresetService(git_source_manager)
636
+ deployment_service = SingleTierDeploymentService(config, deployment_dir)
637
+
638
+ # Validate preset
639
+ if not preset_service.validate_preset(preset_name):
640
+ available = preset_service.list_presets()
641
+ print(f"❌ Unknown preset: {preset_name}")
642
+ print("\n📚 Available presets:")
643
+ for preset in available:
644
+ print(
645
+ f" • {preset['name']}: {preset['description']} ({preset['agent_count']} agents)"
646
+ )
647
+ print(f" Use cases: {', '.join(preset['use_cases'])}")
648
+ return CommandResult.error_result(f"Unknown preset: {preset_name}")
649
+
650
+ # Resolve preset to agent list
651
+ print(f"\n🔍 Resolving preset: {preset_name}")
652
+ resolution = preset_service.resolve_agents(
653
+ preset_name, validate_availability=True
654
+ )
655
+
656
+ # Show preset info
657
+ preset_info = resolution["preset_info"]
658
+ print(f"\n🎯 Preset: {preset_info['description']}")
659
+ print(f" Agents: {preset_info['agent_count']}")
660
+ print(f" Use cases: {', '.join(preset_info['use_cases'])}")
661
+
662
+ # Show warnings for missing agents
663
+ if resolution["missing_agents"]:
664
+ print("\n⚠️ Missing agents (not found in configured sources):")
665
+ for agent_id in resolution["missing_agents"]:
666
+ print(f" • {agent_id}")
667
+ print("\n💡 These agents are not available in your configured sources.")
668
+ print(" Deployment will continue with available agents.")
669
+
670
+ # Show conflicts
671
+ if resolution["conflicts"]:
672
+ print("\n⚠️ Priority conflicts detected:")
673
+ for conflict in resolution["conflicts"]:
674
+ sources = ", ".join(conflict["sources"])
675
+ print(f" • {conflict['agent_id']} (found in: {sources})")
676
+ print(" Using highest priority source for each")
677
+
678
+ # Dry run mode
679
+ if dry_run:
680
+ print("\n🔍 DRY RUN: Preview agent deployment\n")
681
+ print("Agents to deploy:")
682
+ for agent in resolution["agents"]:
683
+ source = agent.get("source", "unknown")
684
+ print(f" ✓ {agent['agent_id']} (from {source})")
685
+ print(
686
+ "\n💡 This is a dry run. Run without --dry-run to actually deploy."
687
+ )
688
+ return CommandResult.success_result(
689
+ "Dry run complete",
690
+ data={
691
+ "preset": preset_name,
692
+ "agents": resolution["agents"],
693
+ "missing": resolution["missing_agents"],
694
+ },
695
+ )
696
+
697
+ # Deploy agents
698
+ print(f"\n📦 Deploying {len(resolution['agents'])} agents...")
699
+ deployed_count = 0
700
+ failed_count = 0
701
+ skipped_count = len(resolution["missing_agents"])
702
+ deployed_agents = []
703
+ failed_agents = []
704
+
705
+ for agent in resolution["agents"]:
706
+ agent_id = agent["agent_id"]
707
+ try:
708
+ # Deploy using single-tier deployment service
709
+ result = deployment_service.deploy_agent(
710
+ agent_id, source_repo=agent.get("source"), dry_run=False
711
+ )
712
+
713
+ if result.get("deployed"):
714
+ deployed_count += 1
715
+ deployed_agents.append(agent_id)
716
+ print(f" ✓ {agent_id}")
717
+ else:
718
+ failed_count += 1
719
+ failed_agents.append(
720
+ {
721
+ "agent_id": agent_id,
722
+ "error": result.get("error", "Unknown"),
723
+ }
724
+ )
725
+ print(f" ✗ {agent_id}: {result.get('error', 'Failed')}")
726
+
727
+ except Exception as e:
728
+ failed_count += 1
729
+ failed_agents.append({"agent_id": agent_id, "error": str(e)})
730
+ print(f" ✗ {agent_id}: {e}")
731
+
732
+ # Summary
733
+ print(f"\n{'=' * 60}")
734
+ print("📊 Deployment Summary")
735
+ print(f"{'=' * 60}")
736
+ print(f" ✅ Deployed: {deployed_count}")
737
+ print(f" ❌ Failed: {failed_count}")
738
+ print(f" ⏭️ Skipped: {skipped_count} (missing from sources)")
739
+ print(f"{'=' * 60}\n")
740
+
741
+ if failed_agents:
742
+ print("❌ Failed agents:")
743
+ for failure in failed_agents:
744
+ print(f" • {failure['agent_id']}: {failure['error']}")
745
+ print()
746
+
747
+ if deployed_count > 0:
748
+ print(f"✅ Successfully deployed {deployed_count} agents!")
749
+ return CommandResult.success_result(
750
+ f"Deployed {deployed_count} agents from preset '{preset_name}'",
751
+ data={
752
+ "preset": preset_name,
753
+ "deployed": deployed_agents,
754
+ "failed": failed_agents,
755
+ "skipped": resolution["missing_agents"],
756
+ },
757
+ )
758
+ return CommandResult.error_result(
759
+ f"No agents deployed from preset '{preset_name}'",
760
+ data={
761
+ "preset": preset_name,
762
+ "failed": failed_agents,
763
+ "skipped": resolution["missing_agents"],
764
+ },
765
+ )
766
+
767
+ except Exception as e:
768
+ self.logger.error(f"Error deploying preset: {e}", exc_info=True)
769
+ print(f"\n❌ Error deploying preset: {e}")
770
+ return CommandResult.error_result(f"Error deploying preset: {e}")
771
+
447
772
  def _clean_agents(self, args) -> CommandResult:
448
773
  """Clean deployed agents."""
449
774
  try:
@@ -904,6 +1229,16 @@ class AgentsCommand(AgentCommand):
904
1229
  self.logger.error(f"Error fixing dependencies: {e}", exc_info=True)
905
1230
  return CommandResult.error_result(f"Error fixing dependencies: {e}")
906
1231
 
1232
+ def _handle_cleanup_command(self, args) -> CommandResult:
1233
+ """Handle cleanup command with proper result wrapping."""
1234
+ exit_code = handle_agents_cleanup(args)
1235
+ return CommandResult(
1236
+ success=exit_code == 0,
1237
+ message=(
1238
+ "Agent cleanup complete" if exit_code == 0 else "Agent cleanup failed"
1239
+ ),
1240
+ )
1241
+
907
1242
  def _cleanup_orphaned_agents(self, args) -> CommandResult:
908
1243
  """Clean up orphaned agents that don't have templates."""
909
1244
  try:
@@ -1125,18 +1460,46 @@ class AgentsCommand(AgentCommand):
1125
1460
  return CommandResult.error_result(f"Error deleting local agents: {e}")
1126
1461
 
1127
1462
  def _manage_local_agents(self, args) -> CommandResult:
1128
- """Launch interactive management menu for local agents."""
1463
+ """Redirect to main configuration interface (DEPRECATED)."""
1129
1464
  try:
1130
- from ..interactive.agent_wizard import run_interactive_agent_manager
1465
+ from rich.console import Console
1466
+ from rich.prompt import Confirm
1131
1467
 
1132
- exit_code = run_interactive_agent_manager()
1133
- if exit_code == 0:
1134
- return CommandResult.success_result("Agent management completed")
1135
- return CommandResult.error_result("Agent management failed or cancelled")
1468
+ console = Console()
1469
+
1470
+ console.print(
1471
+ "\n[bold cyan]╭─────────────────────────────────────────╮[/bold cyan]"
1472
+ )
1473
+ console.print(
1474
+ "[bold cyan]│ Agent Management Has Moved! │[/bold cyan]"
1475
+ )
1476
+ console.print(
1477
+ "[bold cyan]╰─────────────────────────────────────────╯[/bold cyan]\n"
1478
+ )
1479
+
1480
+ console.print("For a better experience with integrated configuration:")
1481
+ console.print(" • Agent management")
1482
+ console.print(" • Skills management")
1483
+ console.print(" • Template editing")
1484
+ console.print(" • Behavior configuration")
1485
+ console.print(" • Startup settings\n")
1486
+
1487
+ console.print("Please use: [bold green]claude-mpm config[/bold green]\n")
1488
+
1489
+ if Confirm.ask("Launch configuration interface now?", default=True):
1490
+ # Import and run config command directly
1491
+ from claude_mpm.cli.commands.configure import ConfigureCommand
1492
+
1493
+ config_cmd = ConfigureCommand()
1494
+ return config_cmd.execute(args)
1495
+ console.print(
1496
+ "\n[dim]Run 'claude-mpm config' anytime to access agent management[/dim]"
1497
+ )
1498
+ return CommandResult.success_result("Redirected to config interface")
1136
1499
 
1137
1500
  except Exception as e:
1138
- self.logger.error(f"Error managing local agents: {e}", exc_info=True)
1139
- return CommandResult.error_result(f"Error managing local agents: {e}")
1501
+ self.logger.error(f"Error redirecting to config: {e}", exc_info=True)
1502
+ return CommandResult.error_result(f"Error redirecting to config: {e}")
1140
1503
 
1141
1504
  def _configure_deployment(self, args) -> CommandResult:
1142
1505
  """Configure agent deployment settings."""
@@ -1448,6 +1811,314 @@ class AgentsCommand(AgentCommand):
1448
1811
  self.logger.error(f"Error recommending agents: {e}", exc_info=True)
1449
1812
  return CommandResult.error_result(f"Error recommending agents: {e}")
1450
1813
 
1814
+ def _migrate_to_project(self, args) -> CommandResult:
1815
+ """Migrate user-level agents to project-level.
1816
+
1817
+ DEPRECATION: User-level agents (~/.claude-mpm/agents/) are deprecated and
1818
+ will be removed in v5.0.0. This command migrates them to project-level
1819
+ (.claude-mpm/agents/) where they belong.
1820
+
1821
+ Args:
1822
+ args: Command arguments with dry_run and force flags
1823
+
1824
+ Returns:
1825
+ CommandResult with migration status
1826
+ """
1827
+ import shutil
1828
+
1829
+ try:
1830
+ user_agents_dir = Path.home() / ".claude-mpm" / "agents"
1831
+ project_agents_dir = Path.cwd() / ".claude-mpm" / "agents"
1832
+
1833
+ dry_run = getattr(args, "dry_run", False)
1834
+ force = getattr(args, "force", False)
1835
+
1836
+ # Check if user agents directory exists
1837
+ if not user_agents_dir.exists():
1838
+ print("✅ No user-level agents found. Nothing to migrate.")
1839
+ return CommandResult.success_result("No user-level agents to migrate")
1840
+
1841
+ # Find all user agent files
1842
+ user_agent_files = list(user_agents_dir.glob("*.json")) + list(
1843
+ user_agents_dir.glob("*.md")
1844
+ )
1845
+
1846
+ if not user_agent_files:
1847
+ print("✅ No user-level agents found. Nothing to migrate.")
1848
+ return CommandResult.success_result("No user-level agents to migrate")
1849
+
1850
+ # Display what we found
1851
+ print(f"\n📦 Found {len(user_agent_files)} user-level agent(s) to migrate:")
1852
+ for agent_file in user_agent_files:
1853
+ print(f" - {agent_file.name}")
1854
+
1855
+ if dry_run:
1856
+ print("\n🔍 DRY RUN: Would migrate to:")
1857
+ print(f" → {project_agents_dir}")
1858
+ print("\nRun without --dry-run to perform the migration.")
1859
+ return CommandResult.success_result(
1860
+ "Dry run completed",
1861
+ data={
1862
+ "user_agents_found": len(user_agent_files),
1863
+ "target_directory": str(project_agents_dir),
1864
+ },
1865
+ )
1866
+
1867
+ # Create project agents directory
1868
+ project_agents_dir.mkdir(parents=True, exist_ok=True)
1869
+
1870
+ # Migrate agents
1871
+ migrated = 0
1872
+ skipped = 0
1873
+ errors = []
1874
+
1875
+ for agent_file in user_agent_files:
1876
+ target_file = project_agents_dir / agent_file.name
1877
+
1878
+ # Check for conflicts
1879
+ if target_file.exists() and not force:
1880
+ print(f"⚠️ Skipping {agent_file.name} (already exists in project)")
1881
+ print(" Use --force to overwrite existing agents")
1882
+ skipped += 1
1883
+ continue
1884
+
1885
+ try:
1886
+ # Copy agent to project directory
1887
+ shutil.copy2(agent_file, target_file)
1888
+ migrated += 1
1889
+ print(f"✅ Migrated {agent_file.name}")
1890
+ except Exception as e:
1891
+ error_msg = f"Failed to migrate {agent_file.name}: {e}"
1892
+ errors.append(error_msg)
1893
+ print(f"❌ {error_msg}")
1894
+
1895
+ # Summary
1896
+ print("\n📊 Migration Summary:")
1897
+ print(f" ✅ Migrated: {migrated}/{len(user_agent_files)}")
1898
+ if skipped > 0:
1899
+ print(f" ⏭️ Skipped: {skipped} (already exist)")
1900
+ if errors:
1901
+ print(f" ❌ Errors: {len(errors)}")
1902
+
1903
+ if migrated > 0:
1904
+ print(f"\n✅ Successfully migrated {migrated} agent(s) to:")
1905
+ print(f" {project_agents_dir}")
1906
+ print(
1907
+ "\n⚠️ IMPORTANT: Verify agents work correctly, then remove user-level agents:"
1908
+ )
1909
+ print(f" rm -rf {user_agents_dir}")
1910
+ print("\n💡 Why this change?")
1911
+ print(" - Project isolation: Each project has its own agents")
1912
+ print(" - Version control: Agents can be versioned with your code")
1913
+ print(" - Team consistency: Everyone uses the same agents")
1914
+
1915
+ return CommandResult.success_result(
1916
+ f"Migrated {migrated} agents",
1917
+ data={
1918
+ "migrated": migrated,
1919
+ "skipped": skipped,
1920
+ "errors": errors,
1921
+ "total": len(user_agent_files),
1922
+ },
1923
+ )
1924
+
1925
+ except Exception as e:
1926
+ self.logger.error(f"Error migrating agents: {e}", exc_info=True)
1927
+ return CommandResult.error_result(f"Error migrating agents: {e}")
1928
+
1929
+ def _deploy_minimal_configuration(self, args) -> CommandResult:
1930
+ """Deploy minimal configuration (6 core agents).
1931
+
1932
+ Part of Phase 3 (1M-382): Agent Selection Modes.
1933
+ Deploy exactly 6 agents for basic Claude MPM workflow:
1934
+ engineer, documentation, qa, research, ops, ticketing.
1935
+ """
1936
+ try:
1937
+ from ...config.agent_sources import AgentSourceConfiguration
1938
+ from ...services.agents.agent_selection_service import AgentSelectionService
1939
+ from ...services.agents.single_tier_deployment_service import (
1940
+ SingleTierDeploymentService,
1941
+ )
1942
+
1943
+ # Initialize services
1944
+ config = AgentSourceConfiguration.load()
1945
+ deployment_dir = Path.home() / ".claude" / "agents"
1946
+ deployment_service = SingleTierDeploymentService(config, deployment_dir)
1947
+ selection_service = AgentSelectionService(deployment_service)
1948
+
1949
+ # Get dry_run flag
1950
+ dry_run = getattr(args, "dry_run", False)
1951
+
1952
+ # Deploy minimal configuration
1953
+ print("🎯 Deploying minimal configuration (6 core agents)...")
1954
+ if dry_run:
1955
+ print("🔍 DRY RUN MODE - No agents will be deployed\n")
1956
+
1957
+ result = selection_service.deploy_minimal_configuration(dry_run=dry_run)
1958
+
1959
+ # Format output
1960
+ output_format = self._get_output_format(args)
1961
+ if self._is_structured_format(output_format):
1962
+ formatted = (
1963
+ self._formatter.format_as_json(result)
1964
+ if str(output_format).lower() == OutputFormat.JSON
1965
+ else self._formatter.format_as_yaml(result)
1966
+ )
1967
+ print(formatted)
1968
+ return CommandResult.success_result(
1969
+ f"Minimal configuration {result['status']}", data=result
1970
+ )
1971
+
1972
+ # Text output
1973
+ print(f"\n{'=' * 60}")
1974
+ print(f"Status: {result['status'].upper()}")
1975
+ print(f"Mode: {result['mode']}")
1976
+ print(f"{'=' * 60}")
1977
+ print(
1978
+ f"\n📊 Summary: {result['deployed_count']} deployed, "
1979
+ f"{result['failed_count']} failed, {result['missing_count']} missing"
1980
+ )
1981
+
1982
+ if result["deployed_agents"]:
1983
+ print(f"\n✅ Deployed agents ({len(result['deployed_agents'])}):")
1984
+ for agent in result["deployed_agents"]:
1985
+ print(f" • {agent}")
1986
+
1987
+ if result["failed_agents"]:
1988
+ print(f"\n❌ Failed agents ({len(result['failed_agents'])}):")
1989
+ for agent in result["failed_agents"]:
1990
+ print(f" • {agent}")
1991
+
1992
+ if result["missing_agents"]:
1993
+ print(f"\n⚠️ Missing agents ({len(result['missing_agents'])}):")
1994
+ for agent in result["missing_agents"]:
1995
+ print(f" • {agent}")
1996
+ print("\nThese agents are not available in configured sources.")
1997
+
1998
+ if dry_run:
1999
+ print(
2000
+ "\n💡 This was a dry run. Run without --dry-run to deploy agents."
2001
+ )
2002
+
2003
+ return CommandResult.success_result(
2004
+ f"Minimal configuration {result['status']}", data=result
2005
+ )
2006
+
2007
+ except Exception as e:
2008
+ self.logger.error(
2009
+ f"Error deploying minimal configuration: {e}", exc_info=True
2010
+ )
2011
+ return CommandResult.error_result(
2012
+ f"Error deploying minimal configuration: {e}"
2013
+ )
2014
+
2015
+ def _deploy_auto_configure(self, args) -> CommandResult:
2016
+ """Auto-detect toolchain and deploy matching agents.
2017
+
2018
+ Part of Phase 3 (1M-382): Agent Selection Modes.
2019
+ Detect project toolchain (languages, frameworks, build tools) and
2020
+ deploy matching specialized agents.
2021
+ """
2022
+ try:
2023
+ from ...config.agent_sources import AgentSourceConfiguration
2024
+ from ...services.agents.agent_selection_service import AgentSelectionService
2025
+ from ...services.agents.single_tier_deployment_service import (
2026
+ SingleTierDeploymentService,
2027
+ )
2028
+
2029
+ # Initialize services
2030
+ config = AgentSourceConfiguration.load()
2031
+ deployment_dir = Path.home() / ".claude" / "agents"
2032
+ deployment_service = SingleTierDeploymentService(config, deployment_dir)
2033
+ selection_service = AgentSelectionService(deployment_service)
2034
+
2035
+ # Get arguments
2036
+ project_path = getattr(args, "path", Path.cwd())
2037
+ dry_run = getattr(args, "dry_run", False)
2038
+
2039
+ # Deploy auto-configure
2040
+ print(f"🔍 Auto-detecting toolchain in {project_path}...")
2041
+ if dry_run:
2042
+ print("🔍 DRY RUN MODE - No agents will be deployed\n")
2043
+
2044
+ result = selection_service.deploy_auto_configure(
2045
+ project_path=project_path, dry_run=dry_run
2046
+ )
2047
+
2048
+ # Format output
2049
+ output_format = self._get_output_format(args)
2050
+ if self._is_structured_format(output_format):
2051
+ formatted = (
2052
+ self._formatter.format_as_json(result)
2053
+ if str(output_format).lower() == OutputFormat.JSON
2054
+ else self._formatter.format_as_yaml(result)
2055
+ )
2056
+ print(formatted)
2057
+ return CommandResult.success_result(
2058
+ f"Auto-configure {result['status']}", data=result
2059
+ )
2060
+
2061
+ # Text output
2062
+ print(f"\n{'=' * 60}")
2063
+ print(f"Status: {result['status'].upper()}")
2064
+ print(f"Mode: {result['mode']}")
2065
+ print(f"{'=' * 60}")
2066
+
2067
+ # Show detected toolchain
2068
+ toolchain = result.get("toolchain", {})
2069
+ print("\n🔧 Detected Toolchain:")
2070
+ if toolchain.get("languages"):
2071
+ print(f" Languages: {', '.join(toolchain['languages'])}")
2072
+ if toolchain.get("frameworks"):
2073
+ print(f" Frameworks: {', '.join(toolchain['frameworks'])}")
2074
+ if toolchain.get("build_tools"):
2075
+ print(f" Build Tools: {', '.join(toolchain['build_tools'])}")
2076
+
2077
+ if not any(toolchain.values()):
2078
+ print(" (No toolchain detected)")
2079
+
2080
+ # Show recommended agents
2081
+ recommended = result.get("recommended_agents", [])
2082
+ if recommended:
2083
+ print(f"\n🎯 Recommended agents ({len(recommended)}):")
2084
+ for agent in recommended:
2085
+ print(f" • {agent}")
2086
+
2087
+ # Show deployment summary
2088
+ print(
2089
+ f"\n📊 Summary: {result['deployed_count']} deployed, "
2090
+ f"{result['failed_count']} failed, {result['missing_count']} missing"
2091
+ )
2092
+
2093
+ if result.get("deployed_agents"):
2094
+ print(f"\n✅ Deployed agents ({len(result['deployed_agents'])}):")
2095
+ for agent in result["deployed_agents"]:
2096
+ print(f" • {agent}")
2097
+
2098
+ if result.get("failed_agents"):
2099
+ print(f"\n❌ Failed agents ({len(result['failed_agents'])}):")
2100
+ for agent in result["failed_agents"]:
2101
+ print(f" • {agent}")
2102
+
2103
+ if result.get("missing_agents"):
2104
+ print(f"\n⚠️ Missing agents ({len(result['missing_agents'])}):")
2105
+ for agent in result["missing_agents"]:
2106
+ print(f" • {agent}")
2107
+ print("\nThese agents are not available in configured sources.")
2108
+
2109
+ if dry_run:
2110
+ print(
2111
+ "\n💡 This was a dry run. Run without --dry-run to deploy agents."
2112
+ )
2113
+
2114
+ return CommandResult.success_result(
2115
+ f"Auto-configure {result['status']}", data=result
2116
+ )
2117
+
2118
+ except Exception as e:
2119
+ self.logger.error(f"Error in auto-configure: {e}", exc_info=True)
2120
+ return CommandResult.error_result(f"Error in auto-configure: {e}")
2121
+
1451
2122
 
1452
2123
  def manage_agents(args):
1453
2124
  """