claude-mpm 4.20.3__py3-none-any.whl → 5.1.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (520) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +35 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1241 -667
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +1 -1
  12. claude_mpm/agents/templates/circuit-breakers.md +1254 -0
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +37 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +959 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +537 -239
  30. claude_mpm/cli/commands/cleanup.py +1 -1
  31. claude_mpm/cli/commands/config.py +7 -4
  32. claude_mpm/cli/commands/configure.py +924 -45
  33. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  34. claude_mpm/cli/commands/configure_navigation.py +63 -46
  35. claude_mpm/cli/commands/debug.py +12 -12
  36. claude_mpm/cli/commands/doctor.py +10 -2
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/local_deploy.py +1 -4
  39. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  40. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  41. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  42. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  43. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  44. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  45. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  46. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  47. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  48. claude_mpm/cli/commands/postmortem.py +401 -0
  49. claude_mpm/cli/commands/run.py +125 -167
  50. claude_mpm/cli/commands/skill_source.py +694 -0
  51. claude_mpm/cli/commands/skills.py +835 -44
  52. claude_mpm/cli/executor.py +78 -3
  53. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  54. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  55. claude_mpm/cli/parsers/agents_parser.py +256 -4
  56. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  57. claude_mpm/cli/parsers/base_parser.py +53 -0
  58. claude_mpm/cli/parsers/config_parser.py +96 -43
  59. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  60. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  61. claude_mpm/cli/parsers/skills_parser.py +145 -0
  62. claude_mpm/cli/parsers/source_parser.py +138 -0
  63. claude_mpm/cli/startup.py +564 -108
  64. claude_mpm/cli/startup_display.py +480 -0
  65. claude_mpm/cli/utils.py +1 -1
  66. claude_mpm/cli_module/commands.py +1 -1
  67. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  68. claude_mpm/commands/mpm-agents-detect.md +9 -0
  69. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  70. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  71. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  72. claude_mpm/commands/mpm-doctor.md +9 -0
  73. claude_mpm/commands/mpm-help.md +17 -2
  74. claude_mpm/commands/mpm-init.md +28 -3
  75. claude_mpm/commands/mpm-monitor.md +9 -0
  76. claude_mpm/commands/mpm-postmortem.md +123 -0
  77. claude_mpm/commands/mpm-session-resume.md +381 -0
  78. claude_mpm/commands/mpm-status.md +9 -0
  79. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  80. claude_mpm/commands/mpm-ticket-view.md +552 -0
  81. claude_mpm/commands/mpm-version.md +9 -0
  82. claude_mpm/commands/mpm.md +11 -0
  83. claude_mpm/config/agent_presets.py +488 -0
  84. claude_mpm/config/agent_sources.py +325 -0
  85. claude_mpm/config/skill_presets.py +392 -0
  86. claude_mpm/config/skill_sources.py +590 -0
  87. claude_mpm/constants.py +13 -0
  88. claude_mpm/core/api_validator.py +1 -1
  89. claude_mpm/core/claude_runner.py +19 -35
  90. claude_mpm/core/config.py +24 -0
  91. claude_mpm/core/constants.py +1 -1
  92. claude_mpm/core/framework/__init__.py +3 -16
  93. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  94. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  95. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  96. claude_mpm/core/hook_error_memory.py +381 -0
  97. claude_mpm/core/hook_manager.py +41 -2
  98. claude_mpm/core/interactive_session.py +131 -10
  99. claude_mpm/core/interfaces.py +56 -1
  100. claude_mpm/core/logger.py +3 -1
  101. claude_mpm/core/oneshot_session.py +110 -8
  102. claude_mpm/core/protocols/__init__.py +23 -0
  103. claude_mpm/core/protocols/runner_protocol.py +103 -0
  104. claude_mpm/core/protocols/session_protocol.py +131 -0
  105. claude_mpm/core/shared/singleton_manager.py +11 -4
  106. claude_mpm/core/system_context.py +38 -0
  107. claude_mpm/core/unified_config.py +22 -0
  108. claude_mpm/dashboard/static/css/activity.css +69 -69
  109. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  110. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  111. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  112. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  114. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  117. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  118. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  119. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  120. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  121. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  122. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  123. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  124. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  125. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  126. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  127. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  128. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  129. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  130. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  131. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  132. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  133. claude_mpm/dashboard/templates/code_simple.html +23 -23
  134. claude_mpm/dashboard/templates/index.html +18 -18
  135. claude_mpm/experimental/cli_enhancements.py +1 -5
  136. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  137. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  138. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  139. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  140. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  141. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  142. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  143. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  144. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  145. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  146. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  147. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  148. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  149. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  150. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  151. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  152. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  153. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  154. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  155. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  156. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  157. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  158. claude_mpm/models/git_repository.py +198 -0
  159. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  160. claude_mpm/scripts/start_activity_logging.py +3 -1
  161. claude_mpm/services/agents/agent_builder.py +45 -9
  162. claude_mpm/services/agents/agent_preset_service.py +238 -0
  163. claude_mpm/services/agents/agent_selection_service.py +484 -0
  164. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  165. claude_mpm/services/agents/cache_git_manager.py +621 -0
  166. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  167. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  168. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  169. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  170. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  171. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  172. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  173. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  174. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  175. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  176. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  177. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  178. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  179. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  180. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  181. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  182. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  183. claude_mpm/services/agents/git_source_manager.py +629 -0
  184. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  185. claude_mpm/services/agents/local_template_manager.py +50 -10
  186. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  187. claude_mpm/services/agents/sources/__init__.py +13 -0
  188. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  189. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  190. claude_mpm/services/agents/startup_sync.py +239 -0
  191. claude_mpm/services/agents/toolchain_detector.py +474 -0
  192. claude_mpm/services/analysis/__init__.py +25 -0
  193. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  194. claude_mpm/services/analysis/postmortem_service.py +765 -0
  195. claude_mpm/services/cli/session_pause_manager.py +504 -0
  196. claude_mpm/services/cli/session_resume_helper.py +36 -16
  197. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  198. claude_mpm/services/command_deployment_service.py +200 -6
  199. claude_mpm/services/core/base.py +31 -11
  200. claude_mpm/services/core/interfaces/__init__.py +1 -3
  201. claude_mpm/services/core/interfaces/health.py +1 -4
  202. claude_mpm/services/core/interfaces.py +56 -1
  203. claude_mpm/services/core/models/__init__.py +2 -11
  204. claude_mpm/services/core/models/agent_config.py +3 -0
  205. claude_mpm/services/core/models/process.py +4 -0
  206. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  207. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  208. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  209. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  210. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  211. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  212. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  213. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  214. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  215. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  216. claude_mpm/services/diagnostics/models.py +21 -0
  217. claude_mpm/services/event_bus/direct_relay.py +3 -3
  218. claude_mpm/services/event_bus/event_bus.py +36 -3
  219. claude_mpm/services/event_bus/relay.py +23 -7
  220. claude_mpm/services/events/consumers/logging.py +1 -2
  221. claude_mpm/services/git/__init__.py +21 -0
  222. claude_mpm/services/git/git_operations_service.py +494 -0
  223. claude_mpm/services/github/__init__.py +21 -0
  224. claude_mpm/services/github/github_cli_service.py +397 -0
  225. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  226. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  227. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  228. claude_mpm/services/instructions/__init__.py +9 -0
  229. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  230. claude_mpm/services/local_ops/__init__.py +5 -13
  231. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  232. claude_mpm/services/local_ops/health_manager.py +1 -4
  233. claude_mpm/services/local_ops/process_manager.py +1 -1
  234. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  235. claude_mpm/services/mcp_config_manager.py +75 -145
  236. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  237. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  238. claude_mpm/services/mcp_gateway/core/process_pool.py +41 -26
  239. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  240. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  241. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  242. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  243. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  244. claude_mpm/services/mcp_service_verifier.py +6 -3
  245. claude_mpm/services/memory/failure_tracker.py +19 -4
  246. claude_mpm/services/memory/optimizer.py +1 -1
  247. claude_mpm/services/model/model_router.py +8 -9
  248. claude_mpm/services/monitor/daemon.py +29 -9
  249. claude_mpm/services/monitor/daemon_manager.py +96 -19
  250. claude_mpm/services/monitor/server.py +2 -2
  251. claude_mpm/services/native_agent_converter.py +356 -0
  252. claude_mpm/services/port_manager.py +1 -1
  253. claude_mpm/services/pr/__init__.py +14 -0
  254. claude_mpm/services/pr/pr_template_service.py +329 -0
  255. claude_mpm/services/project/documentation_manager.py +2 -1
  256. claude_mpm/services/project/project_organizer.py +4 -0
  257. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  258. claude_mpm/services/runner_configuration_service.py +17 -3
  259. claude_mpm/services/self_upgrade_service.py +165 -7
  260. claude_mpm/services/session_management_service.py +16 -4
  261. claude_mpm/services/skills/__init__.py +18 -0
  262. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  263. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  264. claude_mpm/services/skills_config.py +547 -0
  265. claude_mpm/services/skills_deployer.py +955 -0
  266. claude_mpm/services/socketio/handlers/connection.py +1 -1
  267. claude_mpm/services/socketio/handlers/git.py +2 -2
  268. claude_mpm/services/socketio/server/core.py +1 -4
  269. claude_mpm/services/socketio/server/main.py +1 -3
  270. claude_mpm/services/system_instructions_service.py +1 -3
  271. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  272. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  273. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  274. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  275. claude_mpm/services/unified/unified_deployment.py +1 -5
  276. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  277. claude_mpm/services/visualization/__init__.py +1 -5
  278. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  279. claude_mpm/skills/__init__.py +3 -3
  280. claude_mpm/skills/agent_skills_injector.py +42 -49
  281. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  282. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  283. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  284. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  285. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  286. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  287. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  288. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  289. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  290. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  291. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  292. claude_mpm/skills/skills_registry.py +44 -48
  293. claude_mpm/skills/skills_service.py +117 -108
  294. claude_mpm/templates/questions/__init__.py +38 -0
  295. claude_mpm/templates/questions/base.py +193 -0
  296. claude_mpm/templates/questions/pr_strategy.py +311 -0
  297. claude_mpm/templates/questions/project_init.py +385 -0
  298. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  299. claude_mpm/tools/__main__.py +8 -8
  300. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  301. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  302. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  303. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  304. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  305. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  306. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  307. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  308. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  309. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  310. claude_mpm/utils/agent_dependency_loader.py +80 -13
  311. claude_mpm/utils/agent_filters.py +288 -0
  312. claude_mpm/utils/dependency_cache.py +3 -1
  313. claude_mpm/utils/gitignore.py +244 -0
  314. claude_mpm/utils/log_cleanup.py +3 -3
  315. claude_mpm/utils/migration.py +372 -0
  316. claude_mpm/utils/progress.py +387 -0
  317. claude_mpm/utils/robust_installer.py +3 -5
  318. claude_mpm/utils/structured_questions.py +619 -0
  319. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +496 -65
  320. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +328 -416
  321. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  322. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  323. claude_mpm/agents/templates/agent-manager.json +0 -273
  324. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  325. claude_mpm/agents/templates/api_qa.json +0 -180
  326. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  327. claude_mpm/agents/templates/clerk-ops.json +0 -235
  328. claude_mpm/agents/templates/code_analyzer.json +0 -101
  329. claude_mpm/agents/templates/content-agent.json +0 -358
  330. claude_mpm/agents/templates/dart_engineer.json +0 -307
  331. claude_mpm/agents/templates/data_engineer.json +0 -225
  332. claude_mpm/agents/templates/documentation.json +0 -211
  333. claude_mpm/agents/templates/engineer.json +0 -210
  334. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  335. claude_mpm/agents/templates/golang_engineer.json +0 -270
  336. claude_mpm/agents/templates/imagemagick.json +0 -264
  337. claude_mpm/agents/templates/java_engineer.json +0 -346
  338. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  339. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  340. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  341. claude_mpm/agents/templates/memory_manager.json +0 -158
  342. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  343. claude_mpm/agents/templates/ops.json +0 -185
  344. claude_mpm/agents/templates/php-engineer.json +0 -281
  345. claude_mpm/agents/templates/product_owner.json +0 -338
  346. claude_mpm/agents/templates/project_organizer.json +0 -140
  347. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  348. claude_mpm/agents/templates/python_engineer.json +0 -387
  349. claude_mpm/agents/templates/qa.json +0 -242
  350. claude_mpm/agents/templates/react_engineer.json +0 -238
  351. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  352. claude_mpm/agents/templates/research.json +0 -188
  353. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  354. claude_mpm/agents/templates/rust_engineer.json +0 -275
  355. claude_mpm/agents/templates/security.json +0 -202
  356. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  357. claude_mpm/agents/templates/ticketing.json +0 -177
  358. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  359. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  360. claude_mpm/agents/templates/version_control.json +0 -157
  361. claude_mpm/agents/templates/web_qa.json +0 -399
  362. claude_mpm/agents/templates/web_ui.json +0 -189
  363. claude_mpm/cli/commands/mpm_init.py +0 -2093
  364. claude_mpm/commands/mpm-tickets.md +0 -102
  365. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  366. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  367. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  368. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  369. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  370. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  371. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  372. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  373. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  374. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  375. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  376. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  377. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  378. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  379. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  380. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  381. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  382. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  383. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  384. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  385. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  386. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  387. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  388. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  389. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  390. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  391. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  392. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  393. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  394. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  395. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  396. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  397. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  398. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  399. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  400. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  401. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  402. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  403. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  404. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  405. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  406. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  407. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  408. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  409. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  410. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  411. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  412. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  413. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  414. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  415. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  416. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  417. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  418. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  419. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  420. claude_mpm/dashboard/static/built/react/events.js +0 -30
  421. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  422. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  423. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  424. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  425. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  426. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  427. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  428. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  429. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  430. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  444. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  445. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  446. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  447. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  448. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  449. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  450. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  451. claude_mpm/dashboard/static/events.html +0 -607
  452. claude_mpm/dashboard/static/index.html +0 -635
  453. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  454. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  455. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  456. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  457. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  458. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  459. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  460. claude_mpm/dashboard/static/legacy/files.html +0 -747
  461. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  462. claude_mpm/dashboard/static/monitors.html +0 -431
  463. claude_mpm/dashboard/static/production/events.html +0 -659
  464. claude_mpm/dashboard/static/production/main.html +0 -698
  465. claude_mpm/dashboard/static/production/monitors.html +0 -483
  466. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  467. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  468. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  469. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  470. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  471. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -75
  472. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -184
  473. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -107
  474. claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +0 -146
  475. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -118
  476. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -177
  477. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  478. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  479. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  480. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  481. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  482. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  483. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  484. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  485. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  486. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  487. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -175
  488. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  489. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -314
  490. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -227
  491. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -74
  492. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -32
  493. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  494. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  495. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  496. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  497. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -328
  498. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  499. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  500. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  501. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  502. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -209
  503. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -123
  504. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  505. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  506. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  507. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  508. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  509. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  510. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -304
  511. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -96
  512. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  513. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  514. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  515. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  516. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  517. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
  518. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
  519. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
  520. {claude_mpm-4.20.3.dist-info → claude_mpm-5.1.8.dist-info}/top_level.txt +0 -0
@@ -64,10 +64,12 @@ def parse_evaluation_file(file_path: Path) -> list[dict[str, Any]]:
64
64
  answer_elem = qa_pair.find("answer")
65
65
 
66
66
  if question_elem is not None and answer_elem is not None:
67
- evaluations.append({
68
- "question": (question_elem.text or "").strip(),
69
- "answer": (answer_elem.text or "").strip(),
70
- })
67
+ evaluations.append(
68
+ {
69
+ "question": (question_elem.text or "").strip(),
70
+ "answer": (answer_elem.text or "").strip(),
71
+ }
72
+ )
71
73
 
72
74
  return evaluations
73
75
  except Exception as e:
@@ -113,7 +115,11 @@ async def agent_loop(
113
115
  tool_start_ts = time.time()
114
116
  try:
115
117
  tool_result = await connection.call_tool(tool_name, tool_input)
116
- tool_response = json.dumps(tool_result) if isinstance(tool_result, (dict, list)) else str(tool_result)
118
+ tool_response = (
119
+ json.dumps(tool_result)
120
+ if isinstance(tool_result, (dict, list))
121
+ else str(tool_result)
122
+ )
117
123
  except Exception as e:
118
124
  tool_response = f"Error executing tool {tool_name}: {e!s}\n"
119
125
  tool_response += traceback.format_exc()
@@ -124,14 +130,18 @@ async def agent_loop(
124
130
  tool_metrics[tool_name]["count"] += 1
125
131
  tool_metrics[tool_name]["durations"].append(tool_duration)
126
132
 
127
- messages.append({
128
- "role": "user",
129
- "content": [{
130
- "type": "tool_result",
131
- "tool_use_id": tool_use.id,
132
- "content": tool_response,
133
- }]
134
- })
133
+ messages.append(
134
+ {
135
+ "role": "user",
136
+ "content": [
137
+ {
138
+ "type": "tool_result",
139
+ "tool_use_id": tool_use.id,
140
+ "content": tool_response,
141
+ }
142
+ ],
143
+ }
144
+ )
135
145
 
136
146
  response = await asyncio.to_thread(
137
147
  client.messages.create,
@@ -162,7 +172,9 @@ async def evaluate_single_task(
162
172
  start_time = time.time()
163
173
 
164
174
  print(f"Task {task_index + 1}: Running task with question: {qa_pair['question']}")
165
- response, tool_metrics = await agent_loop(client, model, qa_pair["question"], tools, connection)
175
+ response, tool_metrics = await agent_loop(
176
+ client, model, qa_pair["question"], tools, connection
177
+ )
166
178
 
167
179
  response_value = extract_xml_content(response, "response")
168
180
  summary = extract_xml_content(response, "summary")
@@ -177,7 +189,9 @@ async def evaluate_single_task(
177
189
  "score": int(response_value == qa_pair["answer"]) if response_value else 0,
178
190
  "total_duration": duration_seconds,
179
191
  "tool_calls": tool_metrics,
180
- "num_tool_calls": sum(len(metrics["durations"]) for metrics in tool_metrics.values()),
192
+ "num_tool_calls": sum(
193
+ len(metrics["durations"]) for metrics in tool_metrics.values()
194
+ ),
181
195
  "summary": summary,
182
196
  "feedback": feedback,
183
197
  }
@@ -235,13 +249,19 @@ async def run_evaluation(
235
249
  results = []
236
250
  for i, qa_pair in enumerate(qa_pairs):
237
251
  print(f"Processing task {i + 1}/{len(qa_pairs)}")
238
- result = await evaluate_single_task(client, model, qa_pair, tools, connection, i)
252
+ result = await evaluate_single_task(
253
+ client, model, qa_pair, tools, connection, i
254
+ )
239
255
  results.append(result)
240
256
 
241
257
  correct = sum(r["score"] for r in results)
242
258
  accuracy = (correct / len(results)) * 100 if results else 0
243
- average_duration_s = sum(r["total_duration"] for r in results) / len(results) if results else 0
244
- average_tool_calls = sum(r["num_tool_calls"] for r in results) / len(results) if results else 0
259
+ average_duration_s = (
260
+ sum(r["total_duration"] for r in results) / len(results) if results else 0
261
+ )
262
+ average_tool_calls = (
263
+ sum(r["num_tool_calls"] for r in results) / len(results) if results else 0
264
+ )
245
265
  total_tool_calls = sum(r["num_tool_calls"] for r in results)
246
266
 
247
267
  report = REPORT_HEADER.format(
@@ -253,20 +273,22 @@ async def run_evaluation(
253
273
  total_tool_calls=total_tool_calls,
254
274
  )
255
275
 
256
- report += "".join([
257
- TASK_TEMPLATE.format(
258
- task_num=i + 1,
259
- question=qa_pair["question"],
260
- expected_answer=qa_pair["answer"],
261
- actual_answer=result["actual"] or "N/A",
262
- correct_indicator="✅" if result["score"] else "",
263
- total_duration=result["total_duration"],
264
- tool_calls=json.dumps(result["tool_calls"], indent=2),
265
- summary=result["summary"] or "N/A",
266
- feedback=result["feedback"] or "N/A",
267
- )
268
- for i, (qa_pair, result) in enumerate(zip(qa_pairs, results))
269
- ])
276
+ report += "".join(
277
+ [
278
+ TASK_TEMPLATE.format(
279
+ task_num=i + 1,
280
+ question=qa_pair["question"],
281
+ expected_answer=qa_pair["answer"],
282
+ actual_answer=result["actual"] or "N/A",
283
+ correct_indicator="✅" if result["score"] else "❌",
284
+ total_duration=result["total_duration"],
285
+ tool_calls=json.dumps(result["tool_calls"], indent=2),
286
+ summary=result["summary"] or "N/A",
287
+ feedback=result["feedback"] or "N/A",
288
+ )
289
+ for i, (qa_pair, result) in enumerate(zip(qa_pairs, results))
290
+ ]
291
+ )
270
292
 
271
293
  return report
272
294
 
@@ -319,19 +341,50 @@ Examples:
319
341
  )
320
342
 
321
343
  parser.add_argument("eval_file", type=Path, help="Path to evaluation XML file")
322
- parser.add_argument("-t", "--transport", choices=["stdio", "sse", "http"], default="stdio", help="Transport type (default: stdio)")
323
- parser.add_argument("-m", "--model", default="claude-3-7-sonnet-20250219", help="Claude model to use (default: claude-3-7-sonnet-20250219)")
344
+ parser.add_argument(
345
+ "-t",
346
+ "--transport",
347
+ choices=["stdio", "sse", "http"],
348
+ default="stdio",
349
+ help="Transport type (default: stdio)",
350
+ )
351
+ parser.add_argument(
352
+ "-m",
353
+ "--model",
354
+ default="claude-3-7-sonnet-20250219",
355
+ help="Claude model to use (default: claude-3-7-sonnet-20250219)",
356
+ )
324
357
 
325
358
  stdio_group = parser.add_argument_group("stdio options")
326
- stdio_group.add_argument("-c", "--command", help="Command to run MCP server (stdio only)")
327
- stdio_group.add_argument("-a", "--args", nargs="+", help="Arguments for the command (stdio only)")
328
- stdio_group.add_argument("-e", "--env", nargs="+", help="Environment variables in KEY=VALUE format (stdio only)")
359
+ stdio_group.add_argument(
360
+ "-c", "--command", help="Command to run MCP server (stdio only)"
361
+ )
362
+ stdio_group.add_argument(
363
+ "-a", "--args", nargs="+", help="Arguments for the command (stdio only)"
364
+ )
365
+ stdio_group.add_argument(
366
+ "-e",
367
+ "--env",
368
+ nargs="+",
369
+ help="Environment variables in KEY=VALUE format (stdio only)",
370
+ )
329
371
 
330
372
  remote_group = parser.add_argument_group("sse/http options")
331
373
  remote_group.add_argument("-u", "--url", help="MCP server URL (sse/http only)")
332
- remote_group.add_argument("-H", "--header", nargs="+", dest="headers", help="HTTP headers in 'Key: Value' format (sse/http only)")
374
+ remote_group.add_argument(
375
+ "-H",
376
+ "--header",
377
+ nargs="+",
378
+ dest="headers",
379
+ help="HTTP headers in 'Key: Value' format (sse/http only)",
380
+ )
333
381
 
334
- parser.add_argument("-o", "--output", type=Path, help="Output file for evaluation report (default: stdout)")
382
+ parser.add_argument(
383
+ "-o",
384
+ "--output",
385
+ type=Path,
386
+ help="Output file for evaluation report (default: stdout)",
387
+ )
335
388
 
336
389
  args = parser.parse_args()
337
390
 
@@ -187,7 +187,7 @@ Note: This is a text placeholder. Actual assets can be any file type.
187
187
 
188
188
  def title_case_skill_name(skill_name):
189
189
  """Convert hyphenated skill name to Title Case for display."""
190
- return ' '.join(word.capitalize() for word in skill_name.split('-'))
190
+ return " ".join(word.capitalize() for word in skill_name.split("-"))
191
191
 
192
192
 
193
193
  def init_skill(skill_name, path):
@@ -220,11 +220,10 @@ def init_skill(skill_name, path):
220
220
  # Create SKILL.md from template
221
221
  skill_title = title_case_skill_name(skill_name)
222
222
  skill_content = SKILL_TEMPLATE.format(
223
- skill_name=skill_name,
224
- skill_title=skill_title
223
+ skill_name=skill_name, skill_title=skill_title
225
224
  )
226
225
 
227
- skill_md_path = skill_dir / 'SKILL.md'
226
+ skill_md_path = skill_dir / "SKILL.md"
228
227
  try:
229
228
  skill_md_path.write_text(skill_content)
230
229
  print("✅ Created SKILL.md")
@@ -235,24 +234,24 @@ def init_skill(skill_name, path):
235
234
  # Create resource directories with example files
236
235
  try:
237
236
  # Create scripts/ directory with example script
238
- scripts_dir = skill_dir / 'scripts'
237
+ scripts_dir = skill_dir / "scripts"
239
238
  scripts_dir.mkdir(exist_ok=True)
240
- example_script = scripts_dir / 'example.py'
239
+ example_script = scripts_dir / "example.py"
241
240
  example_script.write_text(EXAMPLE_SCRIPT.format(skill_name=skill_name))
242
241
  example_script.chmod(0o755)
243
242
  print("✅ Created scripts/example.py")
244
243
 
245
244
  # Create references/ directory with example reference doc
246
- references_dir = skill_dir / 'references'
245
+ references_dir = skill_dir / "references"
247
246
  references_dir.mkdir(exist_ok=True)
248
- example_reference = references_dir / 'api_reference.md'
247
+ example_reference = references_dir / "api_reference.md"
249
248
  example_reference.write_text(EXAMPLE_REFERENCE.format(skill_title=skill_title))
250
249
  print("✅ Created references/api_reference.md")
251
250
 
252
251
  # Create assets/ directory with example asset placeholder
253
- assets_dir = skill_dir / 'assets'
252
+ assets_dir = skill_dir / "assets"
254
253
  assets_dir.mkdir(exist_ok=True)
255
- example_asset = assets_dir / 'example_asset.txt'
254
+ example_asset = assets_dir / "example_asset.txt"
256
255
  example_asset.write_text(EXAMPLE_ASSET)
257
256
  print("✅ Created assets/example_asset.txt")
258
257
  except Exception as e:
@@ -263,14 +262,16 @@ def init_skill(skill_name, path):
263
262
  print(f"\n✅ Skill '{skill_name}' initialized successfully at {skill_dir}")
264
263
  print("\nNext steps:")
265
264
  print("1. Edit SKILL.md to complete the TODO items and update the description")
266
- print("2. Customize or delete the example files in scripts/, references/, and assets/")
265
+ print(
266
+ "2. Customize or delete the example files in scripts/, references/, and assets/"
267
+ )
267
268
  print("3. Run the validator when ready to check the skill structure")
268
269
 
269
270
  return skill_dir
270
271
 
271
272
 
272
273
  def main():
273
- if len(sys.argv) < 4 or sys.argv[2] != '--path':
274
+ if len(sys.argv) < 4 or sys.argv[2] != "--path":
274
275
  print("Usage: init_skill.py <skill-name> --path <path>")
275
276
  print("\nSkill name requirements:")
276
277
  print(" - Hyphen-case identifier (e.g., 'data-analyzer')")
@@ -66,9 +66,9 @@ def package_skill(skill_path, output_dir=None):
66
66
 
67
67
  # Create the zip file
68
68
  try:
69
- with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
69
+ with zipfile.ZipFile(zip_filename, "w", zipfile.ZIP_DEFLATED) as zipf:
70
70
  # Walk through the skill directory
71
- for file_path in skill_path.rglob('*'):
71
+ for file_path in skill_path.rglob("*"):
72
72
  if file_path.is_file():
73
73
  # Calculate the relative path within the zip
74
74
  arcname = file_path.relative_to(skill_path.parent)
@@ -85,7 +85,9 @@ def package_skill(skill_path, output_dir=None):
85
85
 
86
86
  def main():
87
87
  if len(sys.argv) < 2:
88
- print("Usage: python utils/package_skill.py <path/to/skill-folder> [output-directory]")
88
+ print(
89
+ "Usage: python utils/package_skill.py <path/to/skill-folder> [output-directory]"
90
+ )
89
91
  print("\nExample:")
90
92
  print(" python utils/package_skill.py skills/public/my-skill")
91
93
  print(" python utils/package_skill.py skills/public/my-skill ./dist")
@@ -13,48 +13,55 @@ def validate_skill(skill_path):
13
13
  skill_path = Path(skill_path)
14
14
 
15
15
  # Check SKILL.md exists
16
- skill_md = skill_path / 'SKILL.md'
16
+ skill_md = skill_path / "SKILL.md"
17
17
  if not skill_md.exists():
18
18
  return False, "SKILL.md not found"
19
19
 
20
20
  # Read and validate frontmatter
21
21
  content = skill_md.read_text()
22
- if not content.startswith('---'):
22
+ if not content.startswith("---"):
23
23
  return False, "No YAML frontmatter found"
24
24
 
25
25
  # Extract frontmatter
26
- match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL)
26
+ match = re.match(r"^---\n(.*?)\n---", content, re.DOTALL)
27
27
  if not match:
28
28
  return False, "Invalid frontmatter format"
29
29
 
30
30
  frontmatter = match.group(1)
31
31
 
32
32
  # Check required fields
33
- if 'name:' not in frontmatter:
33
+ if "name:" not in frontmatter:
34
34
  return False, "Missing 'name' in frontmatter"
35
- if 'description:' not in frontmatter:
35
+ if "description:" not in frontmatter:
36
36
  return False, "Missing 'description' in frontmatter"
37
37
 
38
38
  # Extract name for validation
39
- name_match = re.search(r'name:\s*(.+)', frontmatter)
39
+ name_match = re.search(r"name:\s*(.+)", frontmatter)
40
40
  if name_match:
41
41
  name = name_match.group(1).strip()
42
42
  # Check naming convention (hyphen-case: lowercase with hyphens)
43
- if not re.match(r'^[a-z0-9-]+$', name):
44
- return False, f"Name '{name}' should be hyphen-case (lowercase letters, digits, and hyphens only)"
45
- if name.startswith('-') or name.endswith('-') or '--' in name:
46
- return False, f"Name '{name}' cannot start/end with hyphen or contain consecutive hyphens"
43
+ if not re.match(r"^[a-z0-9-]+$", name):
44
+ return (
45
+ False,
46
+ f"Name '{name}' should be hyphen-case (lowercase letters, digits, and hyphens only)",
47
+ )
48
+ if name.startswith("-") or name.endswith("-") or "--" in name:
49
+ return (
50
+ False,
51
+ f"Name '{name}' cannot start/end with hyphen or contain consecutive hyphens",
52
+ )
47
53
 
48
54
  # Extract and validate description
49
- desc_match = re.search(r'description:\s*(.+)', frontmatter)
55
+ desc_match = re.search(r"description:\s*(.+)", frontmatter)
50
56
  if desc_match:
51
57
  description = desc_match.group(1).strip()
52
58
  # Check for angle brackets
53
- if '<' in description or '>' in description:
59
+ if "<" in description or ">" in description:
54
60
  return False, "Description cannot contain angle brackets (< or >)"
55
61
 
56
62
  return True, "Skill is valid!"
57
63
 
64
+
58
65
  if __name__ == "__main__":
59
66
  if len(sys.argv) != 2:
60
67
  print("Usage: python quick_validate.py <skill_directory>")
@@ -433,6 +433,12 @@ def sort_items(items):
433
433
 
434
434
  ### Load Testing
435
435
 
436
+ > **Note:** Locust is an optional dependency. Install it separately if you need load testing capabilities:
437
+ > ```bash
438
+ > pip install "claude-mpm[agents-load-testing]"
439
+ > ```
440
+ > Or install locust directly: `pip install locust>=2.15.0`
441
+
436
442
  ```python
437
443
  # Using locust for load testing
438
444
  from locust import HttpUser, task, between
@@ -2,13 +2,13 @@ from playwright.sync_api import sync_playwright
2
2
 
3
3
  # Example: Capturing console logs during browser automation
4
4
 
5
- url = 'http://localhost:5173' # Replace with your URL
5
+ url = "http://localhost:5173" # Replace with your URL
6
6
 
7
7
  console_logs = []
8
8
 
9
9
  with sync_playwright() as p:
10
10
  browser = p.chromium.launch(headless=True)
11
- page = browser.new_page(viewport={'width': 1920, 'height': 1080})
11
+ page = browser.new_page(viewport={"width": 1920, "height": 1080})
12
12
 
13
13
  # Set up console log capture
14
14
  def handle_console_message(msg):
@@ -19,17 +19,17 @@ with sync_playwright() as p:
19
19
 
20
20
  # Navigate to page
21
21
  page.goto(url)
22
- page.wait_for_load_state('networkidle')
22
+ page.wait_for_load_state("networkidle")
23
23
 
24
24
  # Interact with the page (triggers console logs)
25
- page.click('text=Dashboard')
25
+ page.click("text=Dashboard")
26
26
  page.wait_for_timeout(1000)
27
27
 
28
28
  browser.close()
29
29
 
30
30
  # Save console logs to file
31
- with open('/mnt/user-data/outputs/console.log', 'w') as f:
32
- f.write('\n'.join(console_logs))
31
+ with open("/mnt/user-data/outputs/console.log", "w") as f:
32
+ f.write("\n".join(console_logs))
33
33
 
34
34
  print(f"\nCaptured {len(console_logs)} console messages")
35
35
  print("Logs saved to: /mnt/user-data/outputs/console.log")
@@ -7,34 +7,38 @@ with sync_playwright() as p:
7
7
  page = browser.new_page()
8
8
 
9
9
  # Navigate to page and wait for it to fully load
10
- page.goto('http://localhost:5173')
11
- page.wait_for_load_state('networkidle')
10
+ page.goto("http://localhost:5173")
11
+ page.wait_for_load_state("networkidle")
12
12
 
13
13
  # Discover all buttons on the page
14
- buttons = page.locator('button').all()
14
+ buttons = page.locator("button").all()
15
15
  print(f"Found {len(buttons)} buttons:")
16
16
  for i, button in enumerate(buttons):
17
17
  text = button.inner_text() if button.is_visible() else "[hidden]"
18
18
  print(f" [{i}] {text}")
19
19
 
20
20
  # Discover links
21
- links = page.locator('a[href]').all()
21
+ links = page.locator("a[href]").all()
22
22
  print(f"\nFound {len(links)} links:")
23
23
  for link in links[:5]: # Show first 5
24
24
  text = link.inner_text().strip()
25
- href = link.get_attribute('href')
25
+ href = link.get_attribute("href")
26
26
  print(f" - {text} -> {href}")
27
27
 
28
28
  # Discover input fields
29
- inputs = page.locator('input, textarea, select').all()
29
+ inputs = page.locator("input, textarea, select").all()
30
30
  print(f"\nFound {len(inputs)} input fields:")
31
31
  for input_elem in inputs:
32
- name = input_elem.get_attribute('name') or input_elem.get_attribute('id') or "[unnamed]"
33
- input_type = input_elem.get_attribute('type') or 'text'
32
+ name = (
33
+ input_elem.get_attribute("name")
34
+ or input_elem.get_attribute("id")
35
+ or "[unnamed]"
36
+ )
37
+ input_type = input_elem.get_attribute("type") or "text"
34
38
  print(f" - {name} ({input_type})")
35
39
 
36
40
  # Take screenshot for visual reference
37
- page.screenshot(path='/tmp/page_discovery.png', full_page=True)
41
+ page.screenshot(path="/tmp/page_discovery.png", full_page=True)
38
42
  print("\nScreenshot saved to /tmp/page_discovery.png")
39
43
 
40
44
  browser.close()
@@ -4,30 +4,30 @@ from playwright.sync_api import sync_playwright
4
4
 
5
5
  # Example: Automating interaction with static HTML files using file:// URLs
6
6
 
7
- html_file_path = os.path.abspath('path/to/your/file.html')
8
- file_url = f'file://{html_file_path}'
7
+ html_file_path = os.path.abspath("path/to/your/file.html")
8
+ file_url = f"file://{html_file_path}"
9
9
 
10
10
  with sync_playwright() as p:
11
11
  browser = p.chromium.launch(headless=True)
12
- page = browser.new_page(viewport={'width': 1920, 'height': 1080})
12
+ page = browser.new_page(viewport={"width": 1920, "height": 1080})
13
13
 
14
14
  # Navigate to local HTML file
15
15
  page.goto(file_url)
16
16
 
17
17
  # Take screenshot
18
- page.screenshot(path='/mnt/user-data/outputs/static_page.png', full_page=True)
18
+ page.screenshot(path="/mnt/user-data/outputs/static_page.png", full_page=True)
19
19
 
20
20
  # Interact with elements
21
- page.click('text=Click Me')
22
- page.fill('#name', 'John Doe')
23
- page.fill('#email', 'john@example.com')
21
+ page.click("text=Click Me")
22
+ page.fill("#name", "John Doe")
23
+ page.fill("#email", "john@example.com")
24
24
 
25
25
  # Submit form
26
26
  page.click('button[type="submit"]')
27
27
  page.wait_for_timeout(500)
28
28
 
29
29
  # Take final screenshot
30
- page.screenshot(path='/mnt/user-data/outputs/after_submit.png', full_page=True)
30
+ page.screenshot(path="/mnt/user-data/outputs/after_submit.png", full_page=True)
31
31
 
32
32
  browser.close()
33
33
 
@@ -26,7 +26,7 @@ def is_server_ready(port, timeout=30):
26
26
  start_time = time.time()
27
27
  while time.time() - start_time < timeout:
28
28
  try:
29
- with socket.create_connection(('localhost', port), timeout=1):
29
+ with socket.create_connection(("localhost", port), timeout=1):
30
30
  return True
31
31
  except (OSError, ConnectionRefusedError):
32
32
  time.sleep(0.5)
@@ -34,16 +34,36 @@ def is_server_ready(port, timeout=30):
34
34
 
35
35
 
36
36
  def main():
37
- parser = argparse.ArgumentParser(description='Run command with one or more servers')
38
- parser.add_argument('--server', action='append', dest='servers', required=True, help='Server command (can be repeated)')
39
- parser.add_argument('--port', action='append', dest='ports', type=int, required=True, help='Port for each server (must match --server count)')
40
- parser.add_argument('--timeout', type=int, default=30, help='Timeout in seconds per server (default: 30)')
41
- parser.add_argument('command', nargs=argparse.REMAINDER, help='Command to run after server(s) ready')
37
+ parser = argparse.ArgumentParser(description="Run command with one or more servers")
38
+ parser.add_argument(
39
+ "--server",
40
+ action="append",
41
+ dest="servers",
42
+ required=True,
43
+ help="Server command (can be repeated)",
44
+ )
45
+ parser.add_argument(
46
+ "--port",
47
+ action="append",
48
+ dest="ports",
49
+ type=int,
50
+ required=True,
51
+ help="Port for each server (must match --server count)",
52
+ )
53
+ parser.add_argument(
54
+ "--timeout",
55
+ type=int,
56
+ default=30,
57
+ help="Timeout in seconds per server (default: 30)",
58
+ )
59
+ parser.add_argument(
60
+ "command", nargs=argparse.REMAINDER, help="Command to run after server(s) ready"
61
+ )
42
62
 
43
63
  args = parser.parse_args()
44
64
 
45
65
  # Remove the '--' separator if present
46
- if args.command and args.command[0] == '--':
66
+ if args.command and args.command[0] == "--":
47
67
  args.command = args.command[1:]
48
68
 
49
69
  if not args.command:
@@ -57,28 +77,30 @@ def main():
57
77
 
58
78
  servers = []
59
79
  for cmd, port in zip(args.servers, args.ports):
60
- servers.append({'cmd': cmd, 'port': port})
80
+ servers.append({"cmd": cmd, "port": port})
61
81
 
62
82
  server_processes = []
63
83
 
64
84
  try:
65
85
  # Start all servers
66
86
  for i, server in enumerate(servers):
67
- print(f"Starting server {i+1}/{len(servers)}: {server['cmd']}")
87
+ print(f"Starting server {i + 1}/{len(servers)}: {server['cmd']}")
68
88
 
69
89
  # Use shell=True to support commands with cd and &&
70
90
  process = subprocess.Popen(
71
- server['cmd'],
91
+ server["cmd"],
72
92
  shell=True,
73
93
  stdout=subprocess.PIPE,
74
- stderr=subprocess.PIPE
94
+ stderr=subprocess.PIPE,
75
95
  )
76
96
  server_processes.append(process)
77
97
 
78
98
  # Wait for this server to be ready
79
99
  print(f"Waiting for server on port {server['port']}...")
80
- if not is_server_ready(server['port'], timeout=args.timeout):
81
- raise RuntimeError(f"Server failed to start on port {server['port']} within {args.timeout}s")
100
+ if not is_server_ready(server["port"], timeout=args.timeout):
101
+ raise RuntimeError(
102
+ f"Server failed to start on port {server['port']} within {args.timeout}s"
103
+ )
82
104
 
83
105
  print(f"Server ready on port {server['port']}")
84
106
 
@@ -99,9 +121,9 @@ def main():
99
121
  except subprocess.TimeoutExpired:
100
122
  process.kill()
101
123
  process.wait()
102
- print(f"Server {i+1} stopped")
124
+ print(f"Server {i + 1} stopped")
103
125
  print("All servers stopped")
104
126
 
105
127
 
106
- if __name__ == '__main__':
128
+ if __name__ == "__main__":
107
129
  main()