claude-mpm 4.21.0__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 (497) 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 +14 -2
  63. claude_mpm/commands/mpm-init.md +27 -2
  64. claude_mpm/commands/mpm-monitor.md +9 -0
  65. claude_mpm/commands/mpm-session-resume.md +381 -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 +11 -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/base.py +26 -11
  162. claude_mpm/services/core/interfaces/__init__.py +1 -3
  163. claude_mpm/services/core/interfaces/health.py +1 -4
  164. claude_mpm/services/core/models/__init__.py +2 -11
  165. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  166. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  167. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  168. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  169. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  170. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  171. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  172. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  173. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  174. claude_mpm/services/event_bus/direct_relay.py +3 -3
  175. claude_mpm/services/event_bus/event_bus.py +36 -3
  176. claude_mpm/services/event_bus/relay.py +23 -7
  177. claude_mpm/services/events/consumers/logging.py +1 -2
  178. claude_mpm/services/git/__init__.py +21 -0
  179. claude_mpm/services/git/git_operations_service.py +494 -0
  180. claude_mpm/services/github/__init__.py +21 -0
  181. claude_mpm/services/github/github_cli_service.py +397 -0
  182. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  183. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  184. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  185. claude_mpm/services/instructions/__init__.py +9 -0
  186. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  187. claude_mpm/services/local_ops/__init__.py +3 -13
  188. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  189. claude_mpm/services/local_ops/health_manager.py +1 -4
  190. claude_mpm/services/local_ops/process_manager.py +1 -1
  191. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  192. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  193. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  194. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  195. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  196. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  197. claude_mpm/services/memory/failure_tracker.py +19 -4
  198. claude_mpm/services/memory/optimizer.py +1 -1
  199. claude_mpm/services/model/model_router.py +8 -9
  200. claude_mpm/services/monitor/daemon.py +1 -1
  201. claude_mpm/services/monitor/server.py +2 -2
  202. claude_mpm/services/native_agent_converter.py +356 -0
  203. claude_mpm/services/port_manager.py +1 -1
  204. claude_mpm/services/pr/__init__.py +14 -0
  205. claude_mpm/services/pr/pr_template_service.py +329 -0
  206. claude_mpm/services/project/documentation_manager.py +2 -1
  207. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  208. claude_mpm/services/runner_configuration_service.py +1 -0
  209. claude_mpm/services/self_upgrade_service.py +165 -7
  210. claude_mpm/services/skills/__init__.py +18 -0
  211. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  212. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  213. claude_mpm/services/skills_config.py +547 -0
  214. claude_mpm/services/skills_deployer.py +955 -0
  215. claude_mpm/services/socketio/handlers/connection.py +1 -1
  216. claude_mpm/services/socketio/handlers/git.py +2 -2
  217. claude_mpm/services/socketio/server/core.py +1 -4
  218. claude_mpm/services/socketio/server/main.py +1 -3
  219. claude_mpm/services/system_instructions_service.py +1 -3
  220. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  221. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  222. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  223. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  224. claude_mpm/services/unified/unified_deployment.py +1 -5
  225. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  226. claude_mpm/services/visualization/__init__.py +1 -5
  227. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  228. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  229. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  230. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  231. claude_mpm/skills/skills_registry.py +0 -1
  232. claude_mpm/templates/questions/__init__.py +38 -0
  233. claude_mpm/templates/questions/base.py +193 -0
  234. claude_mpm/templates/questions/pr_strategy.py +311 -0
  235. claude_mpm/templates/questions/project_init.py +385 -0
  236. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  237. claude_mpm/tools/__main__.py +8 -8
  238. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  239. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  240. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  241. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  242. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  243. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  244. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  245. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  246. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  247. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  248. claude_mpm/utils/agent_dependency_loader.py +80 -13
  249. claude_mpm/utils/dependency_cache.py +3 -1
  250. claude_mpm/utils/gitignore.py +241 -0
  251. claude_mpm/utils/log_cleanup.py +3 -3
  252. claude_mpm/utils/progress.py +383 -0
  253. claude_mpm/utils/robust_installer.py +3 -5
  254. claude_mpm/utils/structured_questions.py +619 -0
  255. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
  256. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +264 -427
  257. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  258. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  259. claude_mpm/agents/templates/agent-manager.json +0 -273
  260. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  261. claude_mpm/agents/templates/api_qa.json +0 -180
  262. claude_mpm/agents/templates/clerk-ops.json +0 -235
  263. claude_mpm/agents/templates/code_analyzer.json +0 -101
  264. claude_mpm/agents/templates/content-agent.json +0 -358
  265. claude_mpm/agents/templates/dart_engineer.json +0 -307
  266. claude_mpm/agents/templates/data_engineer.json +0 -225
  267. claude_mpm/agents/templates/documentation.json +0 -211
  268. claude_mpm/agents/templates/engineer.json +0 -210
  269. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  270. claude_mpm/agents/templates/golang_engineer.json +0 -270
  271. claude_mpm/agents/templates/imagemagick.json +0 -264
  272. claude_mpm/agents/templates/java_engineer.json +0 -346
  273. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  274. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  275. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  276. claude_mpm/agents/templates/memory_manager.json +0 -158
  277. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  278. claude_mpm/agents/templates/ops.json +0 -185
  279. claude_mpm/agents/templates/php-engineer.json +0 -287
  280. claude_mpm/agents/templates/product_owner.json +0 -338
  281. claude_mpm/agents/templates/project_organizer.json +0 -140
  282. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  283. claude_mpm/agents/templates/python_engineer.json +0 -387
  284. claude_mpm/agents/templates/qa.json +0 -242
  285. claude_mpm/agents/templates/react_engineer.json +0 -238
  286. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  287. claude_mpm/agents/templates/research.json +0 -188
  288. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  289. claude_mpm/agents/templates/rust_engineer.json +0 -275
  290. claude_mpm/agents/templates/security.json +0 -202
  291. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  292. claude_mpm/agents/templates/ticketing.json +0 -177
  293. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  294. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  295. claude_mpm/agents/templates/version_control.json +0 -157
  296. claude_mpm/agents/templates/web_qa.json +0 -399
  297. claude_mpm/agents/templates/web_ui.json +0 -189
  298. claude_mpm/commands/mpm-tickets.md +0 -102
  299. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  300. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  301. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  302. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  303. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  304. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  305. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  306. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  307. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  308. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  309. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  310. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  311. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  312. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  313. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  314. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  315. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  316. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  317. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  318. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  319. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  320. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  321. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  322. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  323. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  324. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  325. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  326. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  327. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  328. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  329. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  330. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  331. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  332. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  333. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  334. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  335. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  336. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  337. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  338. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  339. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  340. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  341. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  343. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  344. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  345. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  346. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  347. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  349. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  351. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  352. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  353. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  354. claude_mpm/dashboard/static/built/react/events.js +0 -30
  355. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  356. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  357. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  358. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  359. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  360. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  361. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  362. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  363. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  364. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  365. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  366. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  367. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  368. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  369. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  370. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  382. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  383. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  384. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  385. claude_mpm/dashboard/static/events.html +0 -607
  386. claude_mpm/dashboard/static/index.html +0 -635
  387. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  388. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  389. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  390. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  391. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  392. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  393. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  394. claude_mpm/dashboard/static/legacy/files.html +0 -747
  395. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  396. claude_mpm/dashboard/static/monitors.html +0 -431
  397. claude_mpm/dashboard/static/production/events.html +0 -659
  398. claude_mpm/dashboard/static/production/main.html +0 -698
  399. claude_mpm/dashboard/static/production/monitors.html +0 -483
  400. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  401. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  402. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  403. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  404. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  405. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  406. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  407. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  408. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  409. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  410. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  411. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  412. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  413. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  414. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  415. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  416. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  417. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  418. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  419. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  420. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  421. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  422. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  423. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  424. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  425. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  426. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  427. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  432. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  433. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  434. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  435. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  436. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  437. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  438. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  439. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  440. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  441. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  442. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  443. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  444. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  445. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  446. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  447. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  448. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  449. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  450. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  451. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  452. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  453. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  454. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  455. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  456. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  457. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  458. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  459. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  460. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  461. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  462. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  463. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  464. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  465. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  466. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  467. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  468. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  469. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  470. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  472. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  473. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  478. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  479. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  480. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  481. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  482. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  483. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  484. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  485. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  486. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  487. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  488. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  489. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  490. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  491. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  492. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  493. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  494. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
  495. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
  496. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
  497. {claude_mpm-4.21.0.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