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
@@ -15,6 +15,8 @@ import json
15
15
  from pathlib import Path
16
16
  from typing import Dict, List, Optional
17
17
 
18
+ import questionary
19
+ from questionary import Style
18
20
  from rich.console import Console
19
21
  from rich.prompt import Confirm, Prompt
20
22
  from rich.text import Text
@@ -41,6 +43,16 @@ from .configure_validators import (
41
43
  class ConfigureCommand(BaseCommand):
42
44
  """Interactive configuration management command."""
43
45
 
46
+ # Questionary style matching Rich cyan theme
47
+ QUESTIONARY_STYLE = Style(
48
+ [
49
+ ("selected", "fg:cyan bold"),
50
+ ("pointer", "fg:cyan bold"),
51
+ ("highlighted", "fg:cyan"),
52
+ ("question", "fg:cyan bold"),
53
+ ]
54
+ )
55
+
44
56
  def __init__(self):
45
57
  super().__init__("configure")
46
58
  self.console = default_console
@@ -284,61 +296,98 @@ class ConfigureCommand(BaseCommand):
284
296
  return self.navigation.show_main_menu()
285
297
 
286
298
  def _manage_agents(self) -> None:
287
- """Agent management interface."""
299
+ """Enhanced agent management with remote agent discovery and deployment."""
288
300
  while True:
289
301
  self.console.clear()
290
- self._display_header()
291
-
292
- # Display available agents
293
- agents = self.agent_manager.discover_agents()
294
- self._display_agents_table(agents)
295
-
296
- # Show agent menu
297
- self.console.print("\n[bold]Agent Management Options:[/bold]")
302
+ self.navigation.display_header()
303
+ self.console.print("\n[bold blue]═══ Agent Management ═══[/bold blue]\n")
304
+
305
+ # Step 1: Show configured sources
306
+ self.console.print("[bold cyan]═══ Agent Sources ═══[/bold cyan]\n")
307
+
308
+ sources = self._get_configured_sources()
309
+ if sources:
310
+ from rich.table import Table
311
+
312
+ sources_table = Table(show_header=True, header_style="bold cyan")
313
+ sources_table.add_column("Source", style="cyan", width=40)
314
+ sources_table.add_column("Status", style="green", width=15)
315
+ sources_table.add_column("Agents", style="yellow", width=10)
316
+
317
+ for source in sources:
318
+ status = "✓ Active" if source.get("enabled", True) else "Disabled"
319
+ agent_count = source.get("agent_count", "?")
320
+ sources_table.add_row(
321
+ source["identifier"], status, str(agent_count)
322
+ )
298
323
 
299
- # Use Text objects to properly display shortcuts with styling
300
- text_t = Text(" ")
301
- text_t.append("[t]", style="bold blue")
302
- text_t.append(" Toggle agents (enable/disable multiple)")
303
- self.console.print(text_t)
324
+ self.console.print(sources_table)
325
+ else:
326
+ self.console.print("[yellow]No agent sources configured[/yellow]")
327
+ self.console.print(
328
+ "[dim]Default source 'bobmatnyc/claude-mpm-agents' will be used[/dim]\n"
329
+ )
304
330
 
305
- text_c = Text(" ")
306
- text_c.append("[c]", style="bold blue")
307
- text_c.append(" Customize agent template")
308
- self.console.print(text_c)
331
+ # Step 2: Discover and display available agents
332
+ self.console.print("\n[bold cyan]═══ Available Agents ═══[/bold cyan]\n")
309
333
 
310
- text_v = Text(" ")
311
- text_v.append("[v]", style="bold blue")
312
- text_v.append(" View agent details")
313
- self.console.print(text_v)
334
+ try:
335
+ # Discover agents (includes both local and remote)
336
+ agents = self.agent_manager.discover_agents(include_remote=True)
314
337
 
315
- text_r = Text(" ")
316
- text_r.append("[r]", style="bold blue")
317
- text_r.append(" Reset agent to defaults")
318
- self.console.print(text_r)
338
+ if not agents:
339
+ self.console.print("[yellow]No agents found[/yellow]")
340
+ self.console.print(
341
+ "[dim]Configure sources with 'claude-mpm agent-source add'[/dim]\n"
342
+ )
343
+ else:
344
+ # Display agents in a table
345
+ self._display_agents_with_source_info(agents)
319
346
 
320
- text_b = Text(" ")
321
- text_b.append("[b]", style="bold blue")
322
- text_b.append(" Back to main menu")
323
- self.console.print(text_b)
347
+ except Exception as e:
348
+ self.console.print(f"[red]Error discovering agents: {e}[/red]")
349
+ self.logger.error(f"Agent discovery failed: {e}", exc_info=True)
324
350
 
351
+ # Step 3: Menu options with arrow-key navigation
325
352
  self.console.print()
353
+ try:
354
+ choice = questionary.select(
355
+ "Agent Management:",
356
+ choices=[
357
+ "Manage sources (add/remove repositories)",
358
+ "Deploy agents (individual selection)",
359
+ "Deploy preset (predefined sets)",
360
+ "Remove agents",
361
+ "View agent details",
362
+ "Toggle agents (legacy enable/disable)",
363
+ questionary.Separator(),
364
+ "← Back to main menu",
365
+ ],
366
+ style=self.QUESTIONARY_STYLE,
367
+ ).ask()
368
+
369
+ if choice is None or choice == "← Back to main menu":
370
+ break
326
371
 
327
- choice = Prompt.ask("[bold blue]Select an option[/bold blue]", default="b")
328
-
329
- if choice == "b":
372
+ agents_var = agents if "agents" in locals() else []
373
+
374
+ # Map selection to action
375
+ if choice == "Manage sources (add/remove repositories)":
376
+ self._manage_sources()
377
+ elif choice == "Deploy agents (individual selection)":
378
+ self._deploy_agents_individual(agents_var)
379
+ elif choice == "Deploy preset (predefined sets)":
380
+ self._deploy_agents_preset()
381
+ elif choice == "Remove agents":
382
+ self._remove_agents(agents_var)
383
+ elif choice == "View agent details":
384
+ self._view_agent_details_enhanced(agents_var)
385
+ elif choice == "Toggle agents (legacy enable/disable)":
386
+ self._toggle_agents_interactive(agents_var)
387
+
388
+ except KeyboardInterrupt:
389
+ self.console.print("\n[yellow]Operation cancelled[/yellow]")
330
390
  break
331
- if choice == "t":
332
- self._toggle_agents_interactive(agents)
333
- elif choice == "c":
334
- self._customize_agent_template(agents)
335
- elif choice == "v":
336
- self._view_agent_details(agents)
337
- elif choice == "r":
338
- self._reset_agent_defaults(agents)
339
- else:
340
- self.console.print("[red]Invalid choice.[/red]")
341
- Prompt.ask("Press Enter to continue")
342
391
 
343
392
  def _display_agents_table(self, agents: List[AgentConfig]) -> None:
344
393
  """Display a table of available agents."""
@@ -809,6 +858,391 @@ class ConfigureCommand(BaseCommand):
809
858
  except Exception as e:
810
859
  return CommandResult.error_result(f"Startup configuration failed: {e}")
811
860
 
861
+ # ========================================================================
862
+ # Enhanced Agent Management Methods (Remote Agent Discovery Integration)
863
+ # ========================================================================
864
+
865
+ def _get_configured_sources(self) -> List[Dict]:
866
+ """Get list of configured agent sources with agent counts."""
867
+ try:
868
+ from claude_mpm.config.agent_sources import AgentSourceConfiguration
869
+
870
+ config = AgentSourceConfiguration.load()
871
+
872
+ # Convert repositories to source dictionaries
873
+ sources = []
874
+ for repo in config.repositories:
875
+ # Extract identifier from repository
876
+ identifier = repo.identifier
877
+
878
+ # Count agents in cache
879
+ cache_dir = (
880
+ Path.home() / ".claude-mpm" / "cache" / "remote-agents" / identifier
881
+ )
882
+ agent_count = 0
883
+ if cache_dir.exists():
884
+ agents_dir = cache_dir / "agents"
885
+ if agents_dir.exists():
886
+ agent_count = len(list(agents_dir.rglob("*.md")))
887
+
888
+ sources.append(
889
+ {
890
+ "identifier": identifier,
891
+ "url": repo.url,
892
+ "enabled": repo.enabled,
893
+ "priority": repo.priority,
894
+ "agent_count": agent_count,
895
+ }
896
+ )
897
+
898
+ return sources
899
+ except Exception as e:
900
+ self.logger.warning(f"Failed to get configured sources: {e}")
901
+ return []
902
+
903
+ def _display_agents_with_source_info(self, agents: List[AgentConfig]) -> None:
904
+ """Display agents table with source information and deployment status."""
905
+ from rich.table import Table
906
+
907
+ agents_table = Table(show_header=True, header_style="bold cyan")
908
+ agents_table.add_column("#", style="dim", width=4)
909
+ agents_table.add_column("Agent ID", style="cyan", width=35)
910
+ agents_table.add_column("Name", style="green", width=25)
911
+ agents_table.add_column("Source", style="yellow", width=15)
912
+ agents_table.add_column("Status", style="magenta", width=12)
913
+
914
+ for idx, agent in enumerate(agents, 1):
915
+ # Determine source type
916
+ source_type = getattr(agent, "source_type", "local")
917
+ source_label = "Remote" if source_type == "remote" else "Local"
918
+
919
+ # Determine deployment status
920
+ is_deployed = getattr(agent, "is_deployed", False)
921
+ status = "✓ Deployed" if is_deployed else "Available"
922
+
923
+ # Get display name (for remote agents, use display_name instead of agent_id)
924
+ display_name = getattr(agent, "display_name", agent.name)
925
+ if len(display_name) > 23:
926
+ display_name = display_name[:20] + "..."
927
+
928
+ agents_table.add_row(
929
+ str(idx), agent.name, display_name, source_label, status
930
+ )
931
+
932
+ self.console.print(agents_table)
933
+ self.console.print(f"\n[dim]Total: {len(agents)} agents available[/dim]")
934
+
935
+ def _manage_sources(self) -> None:
936
+ """Interactive source management."""
937
+ self.console.print("\n[bold cyan]═══ Manage Agent Sources ═══[/bold cyan]\n")
938
+ self.console.print(
939
+ "[dim]Use 'claude-mpm agent-source' command to add/remove sources[/dim]"
940
+ )
941
+ self.console.print("\nExamples:")
942
+ self.console.print(" claude-mpm agent-source add <git-url>")
943
+ self.console.print(" claude-mpm agent-source remove <identifier>")
944
+ self.console.print(" claude-mpm agent-source list")
945
+ Prompt.ask("\nPress Enter to continue")
946
+
947
+ def _deploy_agents_individual(self, agents: List[AgentConfig]) -> None:
948
+ """Deploy agents individually with selection interface."""
949
+ if not agents:
950
+ self.console.print("[yellow]No agents available for deployment[/yellow]")
951
+ Prompt.ask("\nPress Enter to continue")
952
+ return
953
+
954
+ # Filter to non-deployed agents
955
+ deployable = [a for a in agents if not getattr(a, "is_deployed", False)]
956
+
957
+ if not deployable:
958
+ self.console.print("[yellow]All agents are already deployed[/yellow]")
959
+ Prompt.ask("\nPress Enter to continue")
960
+ return
961
+
962
+ self.console.print(f"\n[bold]Deployable agents ({len(deployable)}):[/bold]")
963
+ for idx, agent in enumerate(deployable, 1):
964
+ display_name = getattr(agent, "display_name", agent.name)
965
+ self.console.print(f" {idx}. {agent.name} - {display_name}")
966
+
967
+ selection = Prompt.ask("\nEnter agent number to deploy (or 'c' to cancel)")
968
+ if selection.lower() == "c":
969
+ return
970
+
971
+ try:
972
+ idx = int(selection) - 1
973
+ if 0 <= idx < len(deployable):
974
+ agent = deployable[idx]
975
+ self._deploy_single_agent(agent)
976
+ else:
977
+ self.console.print("[red]Invalid selection[/red]")
978
+ Prompt.ask("\nPress Enter to continue")
979
+ except (ValueError, IndexError):
980
+ self.console.print("[red]Invalid selection[/red]")
981
+ Prompt.ask("\nPress Enter to continue")
982
+
983
+ def _deploy_agents_preset(self) -> None:
984
+ """Deploy agents using preset configuration."""
985
+ try:
986
+ from claude_mpm.services.agents.agent_preset_service import (
987
+ AgentPresetService,
988
+ )
989
+ from claude_mpm.services.agents.git_source_manager import GitSourceManager
990
+
991
+ source_manager = GitSourceManager()
992
+ preset_service = AgentPresetService(source_manager)
993
+
994
+ presets = preset_service.list_presets()
995
+
996
+ if not presets:
997
+ self.console.print("[yellow]No presets available[/yellow]")
998
+ Prompt.ask("\nPress Enter to continue")
999
+ return
1000
+
1001
+ self.console.print("\n[bold cyan]═══ Available Presets ═══[/bold cyan]\n")
1002
+ for idx, preset in enumerate(presets, 1):
1003
+ self.console.print(f" {idx}. [cyan]{preset['name']}[/cyan]")
1004
+ self.console.print(f" {preset['description']}")
1005
+ self.console.print(f" [dim]Agents: {len(preset['agents'])}[/dim]\n")
1006
+
1007
+ selection = Prompt.ask("\nEnter preset number (or 'c' to cancel)")
1008
+ if selection.lower() == "c":
1009
+ return
1010
+
1011
+ idx = int(selection) - 1
1012
+ if 0 <= idx < len(presets):
1013
+ preset_name = presets[idx]["name"]
1014
+
1015
+ # Resolve and deploy preset
1016
+ resolution = preset_service.resolve_agents(preset_name)
1017
+
1018
+ if resolution.get("missing_agents"):
1019
+ self.console.print(
1020
+ f"[red]Missing agents: {len(resolution['missing_agents'])}[/red]"
1021
+ )
1022
+ for agent_id in resolution["missing_agents"]:
1023
+ self.console.print(f" • {agent_id}")
1024
+ Prompt.ask("\nPress Enter to continue")
1025
+ return
1026
+
1027
+ # Confirm deployment
1028
+ self.console.print(
1029
+ f"\n[bold]Preset '{preset_name}' includes {len(resolution['agents'])} agents[/bold]"
1030
+ )
1031
+ if Confirm.ask("Deploy all agents?", default=True):
1032
+ deployed = 0
1033
+ for agent in resolution["agents"]:
1034
+ # Convert dict to AgentConfig-like object for deployment
1035
+ agent_config = AgentConfig(
1036
+ name=agent.get("agent_id", "unknown"),
1037
+ description=agent.get("metadata", {}).get(
1038
+ "description", ""
1039
+ ),
1040
+ dependencies=[],
1041
+ )
1042
+ agent_config.source_dict = agent
1043
+ agent_config.full_agent_id = agent.get("agent_id", "unknown")
1044
+
1045
+ if self._deploy_single_agent(agent_config, show_feedback=False):
1046
+ deployed += 1
1047
+
1048
+ self.console.print(
1049
+ f"\n[green]✓ Deployed {deployed}/{len(resolution['agents'])} agents[/green]"
1050
+ )
1051
+
1052
+ Prompt.ask("\nPress Enter to continue")
1053
+ else:
1054
+ self.console.print("[red]Invalid selection[/red]")
1055
+ Prompt.ask("\nPress Enter to continue")
1056
+
1057
+ except Exception as e:
1058
+ self.console.print(f"[red]Error deploying preset: {e}[/red]")
1059
+ self.logger.error(f"Preset deployment failed: {e}", exc_info=True)
1060
+ Prompt.ask("\nPress Enter to continue")
1061
+
1062
+ def _deploy_single_agent(
1063
+ self, agent: AgentConfig, show_feedback: bool = True
1064
+ ) -> bool:
1065
+ """Deploy a single agent to the appropriate location."""
1066
+ try:
1067
+ # Check if this is a remote agent with source_dict
1068
+ source_dict = getattr(agent, "source_dict", None)
1069
+ full_agent_id = getattr(agent, "full_agent_id", agent.name)
1070
+
1071
+ if source_dict:
1072
+ # Deploy remote agent using its source file
1073
+ source_file = Path(source_dict.get("source_file", ""))
1074
+ if not source_file.exists():
1075
+ if show_feedback:
1076
+ self.console.print(
1077
+ f"[red]✗ Source file not found: {source_file}[/red]"
1078
+ )
1079
+ return False
1080
+
1081
+ # Determine target file name (use leaf name from hierarchical ID)
1082
+ if "/" in full_agent_id:
1083
+ target_name = full_agent_id.split("/")[-1] + ".md"
1084
+ else:
1085
+ target_name = full_agent_id + ".md"
1086
+
1087
+ # Deploy to user-level agents directory
1088
+ target_dir = Path.home() / ".claude" / "agents"
1089
+ target_dir.mkdir(parents=True, exist_ok=True)
1090
+ target_file = target_dir / target_name
1091
+
1092
+ if show_feedback:
1093
+ self.console.print(f"\n[cyan]Deploying {full_agent_id}...[/cyan]")
1094
+
1095
+ # Copy the agent file
1096
+ import shutil
1097
+
1098
+ shutil.copy2(source_file, target_file)
1099
+
1100
+ if show_feedback:
1101
+ self.console.print(
1102
+ f"[green]✓ Successfully deployed {full_agent_id} to {target_file}[/green]"
1103
+ )
1104
+ Prompt.ask("\nPress Enter to continue")
1105
+
1106
+ return True
1107
+ # Legacy local template deployment (not implemented here)
1108
+ if show_feedback:
1109
+ self.console.print(
1110
+ "[yellow]Local template deployment not yet implemented[/yellow]"
1111
+ )
1112
+ Prompt.ask("\nPress Enter to continue")
1113
+ return False
1114
+
1115
+ except Exception as e:
1116
+ if show_feedback:
1117
+ self.console.print(f"[red]Error deploying agent: {e}[/red]")
1118
+ self.logger.error(f"Agent deployment failed: {e}", exc_info=True)
1119
+ Prompt.ask("\nPress Enter to continue")
1120
+ return False
1121
+
1122
+ def _remove_agents(self, agents: List[AgentConfig]) -> None:
1123
+ """Remove deployed agents."""
1124
+ # Filter to deployed agents only
1125
+ deployed = [a for a in agents if getattr(a, "is_deployed", False)]
1126
+
1127
+ if not deployed:
1128
+ self.console.print("[yellow]No agents are currently deployed[/yellow]")
1129
+ Prompt.ask("\nPress Enter to continue")
1130
+ return
1131
+
1132
+ self.console.print(f"\n[bold]Deployed agents ({len(deployed)}):[/bold]")
1133
+ for idx, agent in enumerate(deployed, 1):
1134
+ display_name = getattr(agent, "display_name", agent.name)
1135
+ self.console.print(f" {idx}. {agent.name} - {display_name}")
1136
+
1137
+ selection = Prompt.ask("\nEnter agent number to remove (or 'c' to cancel)")
1138
+ if selection.lower() == "c":
1139
+ return
1140
+
1141
+ try:
1142
+ idx = int(selection) - 1
1143
+ if 0 <= idx < len(deployed):
1144
+ agent = deployed[idx]
1145
+ full_agent_id = getattr(agent, "full_agent_id", agent.name)
1146
+
1147
+ # Determine possible file names (hierarchical and leaf)
1148
+ file_names = [f"{full_agent_id}.md"]
1149
+ if "/" in full_agent_id:
1150
+ leaf_name = full_agent_id.split("/")[-1]
1151
+ file_names.append(f"{leaf_name}.md")
1152
+
1153
+ # Remove from both project and user directories
1154
+ removed = False
1155
+ project_agent_dir = Path.cwd() / ".claude-mpm" / "agents"
1156
+ user_agent_dir = Path.home() / ".claude" / "agents"
1157
+
1158
+ for file_name in file_names:
1159
+ project_file = project_agent_dir / file_name
1160
+ user_file = user_agent_dir / file_name
1161
+
1162
+ if project_file.exists():
1163
+ project_file.unlink()
1164
+ removed = True
1165
+ self.console.print(f"[green]✓ Removed {project_file}[/green]")
1166
+
1167
+ if user_file.exists():
1168
+ user_file.unlink()
1169
+ removed = True
1170
+ self.console.print(f"[green]✓ Removed {user_file}[/green]")
1171
+
1172
+ if removed:
1173
+ self.console.print(
1174
+ f"[green]✓ Successfully removed {full_agent_id}[/green]"
1175
+ )
1176
+ else:
1177
+ self.console.print("[yellow]Agent files not found[/yellow]")
1178
+
1179
+ Prompt.ask("\nPress Enter to continue")
1180
+ else:
1181
+ self.console.print("[red]Invalid selection[/red]")
1182
+ Prompt.ask("\nPress Enter to continue")
1183
+
1184
+ except (ValueError, IndexError):
1185
+ self.console.print("[red]Invalid selection[/red]")
1186
+ Prompt.ask("\nPress Enter to continue")
1187
+
1188
+ def _view_agent_details_enhanced(self, agents: List[AgentConfig]) -> None:
1189
+ """View detailed agent information with enhanced remote agent details."""
1190
+ if not agents:
1191
+ self.console.print("[yellow]No agents available[/yellow]")
1192
+ Prompt.ask("\nPress Enter to continue")
1193
+ return
1194
+
1195
+ self.console.print(f"\n[bold]Available agents ({len(agents)}):[/bold]")
1196
+ for idx, agent in enumerate(agents, 1):
1197
+ display_name = getattr(agent, "display_name", agent.name)
1198
+ self.console.print(f" {idx}. {agent.name} - {display_name}")
1199
+
1200
+ selection = Prompt.ask("\nEnter agent number to view (or 'c' to cancel)")
1201
+ if selection.lower() == "c":
1202
+ return
1203
+
1204
+ try:
1205
+ idx = int(selection) - 1
1206
+ if 0 <= idx < len(agents):
1207
+ agent = agents[idx]
1208
+
1209
+ self.console.clear()
1210
+ self.console.print("\n[bold cyan]═══ Agent Details ═══[/bold cyan]\n")
1211
+
1212
+ # Basic info
1213
+ self.console.print(f"[bold]ID:[/bold] {agent.name}")
1214
+ display_name = getattr(agent, "display_name", "N/A")
1215
+ self.console.print(f"[bold]Name:[/bold] {display_name}")
1216
+ self.console.print(f"[bold]Description:[/bold] {agent.description}")
1217
+
1218
+ # Source info
1219
+ source_type = getattr(agent, "source_type", "local")
1220
+ self.console.print(f"[bold]Source Type:[/bold] {source_type}")
1221
+
1222
+ if source_type == "remote":
1223
+ source_dict = getattr(agent, "source_dict", {})
1224
+ category = source_dict.get("category", "N/A")
1225
+ source = source_dict.get("source", "N/A")
1226
+ version = source_dict.get("version", "N/A")
1227
+
1228
+ self.console.print(f"[bold]Category:[/bold] {category}")
1229
+ self.console.print(f"[bold]Source:[/bold] {source}")
1230
+ self.console.print(f"[bold]Version:[/bold] {version[:16]}...")
1231
+
1232
+ # Deployment status
1233
+ is_deployed = getattr(agent, "is_deployed", False)
1234
+ status = "✓ Deployed" if is_deployed else "Available"
1235
+ self.console.print(f"[bold]Status:[/bold] {status}")
1236
+
1237
+ Prompt.ask("\nPress Enter to continue")
1238
+ else:
1239
+ self.console.print("[red]Invalid selection[/red]")
1240
+ Prompt.ask("\nPress Enter to continue")
1241
+
1242
+ except (ValueError, IndexError):
1243
+ self.console.print("[red]Invalid selection[/red]")
1244
+ Prompt.ask("\nPress Enter to continue")
1245
+
812
1246
 
813
1247
  def manage_configure(args) -> int:
814
1248
  """Main entry point for configuration management command.
@@ -228,8 +228,8 @@ class AgentDisplay:
228
228
  [bold]Model:[/bold] {model}
229
229
  [bold]Agent Version:[/bold] {agent_version}
230
230
  [bold]Schema Version:[/bold] {schema_version}
231
- [bold]Tags:[/bold] {', '.join(tags) if tags else 'None'}
232
- [bold]Tools:[/bold] {', '.join(tools[:5]) if tools else 'None'}{'...' if len(tools) > 5 else ''}
231
+ [bold]Tags:[/bold] {", ".join(tags) if tags else "None"}
232
+ [bold]Tools:[/bold] {", ".join(tools[:5]) if tools else "None"}{"..." if len(tools) > 5 else ""}
233
233
  """
234
234
  except Exception:
235
235
  pass
@@ -237,9 +237,9 @@ class AgentDisplay:
237
237
  # Create detail panel
238
238
  detail_text = f"""
239
239
  [bold]Name:[/bold] {agent.name}
240
- [bold]Status:[/bold] {'[green]Enabled[/green]' if self.agent_manager.is_agent_enabled(agent.name) else '[red]Disabled[/red]'}
240
+ [bold]Status:[/bold] {"[green]Enabled[/green]" if self.agent_manager.is_agent_enabled(agent.name) else "[red]Disabled[/red]"}
241
241
  [bold]Template Path:[/bold] {template_path}
242
- [bold]Is System Template:[/bold] {'Yes' if str(template_path).startswith(str(self.agent_manager.templates_dir)) else 'No (Custom)'}
242
+ [bold]Is System Template:[/bold] {"Yes" if str(template_path).startswith(str(self.agent_manager.templates_dir)) else "No (Custom)"}
243
243
  {extra_info}
244
244
  """
245
245