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
@@ -63,7 +63,9 @@ class SkillsService(LoggerMixin):
63
63
  self.bundled_skills_path: Path = Path(__file__).parent / "bundled"
64
64
  self.deployed_skills_path: Path = self.project_root / ".claude" / "skills"
65
65
  self.registry_path: Path = (
66
- Path(__file__).parent.parent.parent.parent / "config" / "skills_registry.yaml"
66
+ Path(__file__).parent.parent.parent.parent
67
+ / "config"
68
+ / "skills_registry.yaml"
67
69
  )
68
70
 
69
71
  # Load registry
@@ -139,7 +141,7 @@ class SkillsService(LoggerMixin):
139
141
  return {}
140
142
 
141
143
  try:
142
- with open(self.registry_path, encoding='utf-8') as f:
144
+ with open(self.registry_path, encoding="utf-8") as f:
143
145
  registry = yaml.safe_load(f)
144
146
  if not registry:
145
147
  self.logger.warning(f"Empty registry file: {self.registry_path}")
@@ -176,11 +178,13 @@ class SkillsService(LoggerMixin):
176
178
  skills = []
177
179
 
178
180
  if not self.bundled_skills_path.exists():
179
- self.logger.warning(f"Bundled skills path not found: {self.bundled_skills_path}")
181
+ self.logger.warning(
182
+ f"Bundled skills path not found: {self.bundled_skills_path}"
183
+ )
180
184
  return skills
181
185
 
182
186
  for category_dir in self.bundled_skills_path.iterdir():
183
- if not category_dir.is_dir() or category_dir.name.startswith('.'):
187
+ if not category_dir.is_dir() or category_dir.name.startswith("."):
184
188
  continue
185
189
 
186
190
  for skill_dir in category_dir.iterdir():
@@ -190,12 +194,14 @@ class SkillsService(LoggerMixin):
190
194
  skill_md = skill_dir / "SKILL.md"
191
195
  if skill_md.exists():
192
196
  metadata = self._parse_skill_metadata(skill_md)
193
- skills.append({
194
- 'name': skill_dir.name,
195
- 'category': category_dir.name,
196
- 'path': skill_dir,
197
- 'metadata': metadata
198
- })
197
+ skills.append(
198
+ {
199
+ "name": skill_dir.name,
200
+ "category": category_dir.name,
201
+ "path": skill_dir,
202
+ "metadata": metadata,
203
+ }
204
+ )
199
205
 
200
206
  self.logger.info(f"Discovered {len(skills)} bundled skills")
201
207
  return skills
@@ -220,10 +226,10 @@ class SkillsService(LoggerMixin):
220
226
  Dict containing frontmatter metadata, or empty dict if parsing fails
221
227
  """
222
228
  try:
223
- content = skill_md.read_text(encoding='utf-8')
229
+ content = skill_md.read_text(encoding="utf-8")
224
230
 
225
231
  # Match YAML frontmatter: ---\n...yaml...\n---
226
- match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL)
232
+ match = re.match(r"^---\n(.*?)\n---", content, re.DOTALL)
227
233
 
228
234
  if not match:
229
235
  self.logger.warning(f"No YAML frontmatter found in {skill_md}")
@@ -233,7 +239,9 @@ class SkillsService(LoggerMixin):
233
239
  metadata = yaml.safe_load(match.group(1))
234
240
  return metadata or {}
235
241
  except yaml.YAMLError as e:
236
- self.logger.error(f"Failed to parse YAML frontmatter in {skill_md}: {e}")
242
+ self.logger.error(
243
+ f"Failed to parse YAML frontmatter in {skill_md}: {e}"
244
+ )
237
245
  return {}
238
246
  except Exception as e:
239
247
  self.logger.error(f"Failed to read skill file {skill_md}: {e}")
@@ -270,11 +278,11 @@ class SkillsService(LoggerMixin):
270
278
  for skill in skills:
271
279
  try:
272
280
  # Create category directory in deployment location
273
- target_category_dir = self.deployed_skills_path / skill['category']
281
+ target_category_dir = self.deployed_skills_path / skill["category"]
274
282
  target_category_dir.mkdir(parents=True, exist_ok=True)
275
283
 
276
284
  # Target path for this skill
277
- target_dir = target_category_dir / skill['name']
285
+ target_dir = target_category_dir / skill["name"]
278
286
 
279
287
  # SECURITY: Validate path is within deployed_skills_path
280
288
  if not self._validate_safe_path(self.deployed_skills_path, target_dir):
@@ -282,15 +290,19 @@ class SkillsService(LoggerMixin):
282
290
 
283
291
  # Check if already deployed
284
292
  if target_dir.exists() and not force:
285
- skipped.append(skill['name'])
293
+ skipped.append(skill["name"])
286
294
  self.logger.debug(f"Skipped {skill['name']} (already deployed)")
287
295
  continue
288
296
 
289
297
  # Deploy skill
290
298
  if target_dir.exists():
291
299
  # SECURITY: Verify again before deletion and check for symlinks
292
- if not self._validate_safe_path(self.deployed_skills_path, target_dir):
293
- raise ValueError("Refusing to delete path outside skills directory")
300
+ if not self._validate_safe_path(
301
+ self.deployed_skills_path, target_dir
302
+ ):
303
+ raise ValueError(
304
+ "Refusing to delete path outside skills directory"
305
+ )
294
306
 
295
307
  if target_dir.is_symlink():
296
308
  self.logger.warning(f"Refusing to delete symlink: {target_dir}")
@@ -298,25 +310,21 @@ class SkillsService(LoggerMixin):
298
310
  else:
299
311
  shutil.rmtree(target_dir)
300
312
 
301
- shutil.copytree(skill['path'], target_dir)
313
+ shutil.copytree(skill["path"], target_dir)
302
314
 
303
- deployed.append(skill['name'])
315
+ deployed.append(skill["name"])
304
316
  self.logger.debug(f"Deployed skill: {skill['name']}")
305
317
 
306
318
  except (ValueError, OSError) as e:
307
319
  self.logger.error(f"Failed to deploy {skill['name']}: {e}")
308
- errors.append({'skill': skill['name'], 'error': str(e)})
320
+ errors.append({"skill": skill["name"], "error": str(e)})
309
321
 
310
322
  self.logger.info(
311
323
  f"Skills deployment: {len(deployed)} deployed, "
312
324
  f"{len(skipped)} skipped, {len(errors)} errors"
313
325
  )
314
326
 
315
- return {
316
- 'deployed': deployed,
317
- 'skipped': skipped,
318
- 'errors': errors
319
- }
327
+ return {"deployed": deployed, "skipped": skipped, "errors": errors}
320
328
 
321
329
  def get_skills_for_agent(self, agent_id: str) -> List[str]:
322
330
  """Get list of skills assigned to specific agent.
@@ -334,14 +342,14 @@ class SkillsService(LoggerMixin):
334
342
  >>> skills = service.get_skills_for_agent('engineer')
335
343
  >>> # Returns: ['test-driven-development', 'systematic-debugging', ...]
336
344
  """
337
- if 'agent_skills' not in self.registry:
345
+ if "agent_skills" not in self.registry:
338
346
  return []
339
347
 
340
- agent_skills = self.registry['agent_skills'].get(agent_id, {})
348
+ agent_skills = self.registry["agent_skills"].get(agent_id, {})
341
349
 
342
350
  # Combine required and optional skills
343
- required = agent_skills.get('required', [])
344
- optional = agent_skills.get('optional', [])
351
+ required = agent_skills.get("required", [])
352
+ optional = agent_skills.get("optional", [])
345
353
 
346
354
  return required + optional
347
355
 
@@ -366,10 +374,7 @@ class SkillsService(LoggerMixin):
366
374
  - metadata: Parsed metadata (if valid)
367
375
  """
368
376
  # Find skill in deployed or bundled paths
369
- skill_paths = [
370
- self.deployed_skills_path,
371
- self.bundled_skills_path
372
- ]
377
+ skill_paths = [self.deployed_skills_path, self.bundled_skills_path]
373
378
 
374
379
  for base_path in skill_paths:
375
380
  if not base_path.exists():
@@ -384,9 +389,9 @@ class SkillsService(LoggerMixin):
384
389
  return self._validate_skill_structure(skill_dir)
385
390
 
386
391
  return {
387
- 'valid': False,
388
- 'errors': [f"Skill not found: {skill_name}"],
389
- 'warnings': []
392
+ "valid": False,
393
+ "errors": [f"Skill not found: {skill_name}"],
394
+ "warnings": [],
390
395
  }
391
396
 
392
397
  def _validate_skill_structure(self, skill_dir: Path) -> Dict[str, Any]:
@@ -413,40 +418,40 @@ class SkillsService(LoggerMixin):
413
418
  skill_md = skill_dir / "SKILL.md"
414
419
  if not skill_md.exists():
415
420
  errors.append("Missing SKILL.md")
416
- return {
417
- 'valid': False,
418
- 'errors': errors,
419
- 'warnings': warnings
420
- }
421
+ return {"valid": False, "errors": errors, "warnings": warnings}
421
422
 
422
423
  # Parse and validate metadata
423
424
  metadata = self._parse_skill_metadata(skill_md)
424
425
 
425
426
  if not metadata:
426
427
  errors.append("Missing or invalid YAML frontmatter")
427
- return {
428
- 'valid': False,
429
- 'errors': errors,
430
- 'warnings': warnings
431
- }
428
+ return {"valid": False, "errors": errors, "warnings": warnings}
432
429
 
433
430
  # Rule 5: Required fields
434
- required_fields = ['name', 'description', 'version', 'category', 'progressive_disclosure']
431
+ required_fields = [
432
+ "name",
433
+ "description",
434
+ "version",
435
+ "category",
436
+ "progressive_disclosure",
437
+ ]
435
438
  for field in required_fields:
436
439
  if field not in metadata:
437
440
  errors.append(f"Missing required field: {field}")
438
441
 
439
442
  # Rule 6: Name format
440
- if 'name' in metadata:
441
- name = metadata['name']
442
- if not re.match(r'^[a-z][a-z0-9-]*[a-z0-9]$', name):
443
+ if "name" in metadata:
444
+ name = metadata["name"]
445
+ if not re.match(r"^[a-z][a-z0-9-]*[a-z0-9]$", name):
443
446
  errors.append(f"Invalid name format: {name}")
444
447
 
445
448
  # Rule 8: Description length
446
- if 'description' in metadata:
447
- desc_len = len(metadata['description'])
449
+ if "description" in metadata:
450
+ desc_len = len(metadata["description"])
448
451
  if desc_len < 10 or desc_len > 150:
449
- errors.append(f"Description must be 10-150 characters (found {desc_len})")
452
+ errors.append(
453
+ f"Description must be 10-150 characters (found {desc_len})"
454
+ )
450
455
 
451
456
  # Check for optional directories
452
457
  if (skill_dir / "scripts").exists():
@@ -456,10 +461,10 @@ class SkillsService(LoggerMixin):
456
461
  warnings.append("Contains references/ directory")
457
462
 
458
463
  return {
459
- 'valid': len(errors) == 0,
460
- 'errors': errors,
461
- 'warnings': warnings,
462
- 'metadata': metadata
464
+ "valid": len(errors) == 0,
465
+ "errors": errors,
466
+ "warnings": warnings,
467
+ "metadata": metadata,
463
468
  }
464
469
 
465
470
  def check_for_updates(self) -> Dict[str, Any]:
@@ -477,7 +482,7 @@ class SkillsService(LoggerMixin):
477
482
  - not_deployed: List of skill names (in bundled, not deployed)
478
483
  - orphaned: List of skill names (in deployed, not bundled)
479
484
  """
480
- bundled = {s['name']: s for s in self.discover_bundled_skills()}
485
+ bundled = {s["name"]: s for s in self.discover_bundled_skills()}
481
486
 
482
487
  # Discover deployed skills
483
488
  deployed = {}
@@ -494,10 +499,10 @@ class SkillsService(LoggerMixin):
494
499
  if skill_md.exists():
495
500
  metadata = self._parse_skill_metadata(skill_md)
496
501
  deployed[skill_dir.name] = {
497
- 'name': skill_dir.name,
498
- 'category': category_dir.name,
499
- 'path': skill_dir,
500
- 'metadata': metadata
502
+ "name": skill_dir.name,
503
+ "category": category_dir.name,
504
+ "path": skill_dir,
505
+ "metadata": metadata,
501
506
  }
502
507
 
503
508
  updates_available = []
@@ -507,19 +512,21 @@ class SkillsService(LoggerMixin):
507
512
 
508
513
  # Check for updates
509
514
  for name, bundled_skill in bundled.items():
510
- bundled_version = bundled_skill['metadata'].get('version', '0.0.0')
515
+ bundled_version = bundled_skill["metadata"].get("version", "0.0.0")
511
516
 
512
517
  if name not in deployed:
513
518
  not_deployed.append(name)
514
519
  else:
515
- deployed_version = deployed[name]['metadata'].get('version', '0.0.0')
520
+ deployed_version = deployed[name]["metadata"].get("version", "0.0.0")
516
521
 
517
522
  if deployed_version != bundled_version:
518
- updates_available.append({
519
- 'name': name,
520
- 'current_version': deployed_version,
521
- 'new_version': bundled_version
522
- })
523
+ updates_available.append(
524
+ {
525
+ "name": name,
526
+ "current_version": deployed_version,
527
+ "new_version": bundled_version,
528
+ }
529
+ )
523
530
  else:
524
531
  up_to_date.append(name)
525
532
 
@@ -529,10 +536,10 @@ class SkillsService(LoggerMixin):
529
536
  orphaned.append(name)
530
537
 
531
538
  return {
532
- 'updates_available': updates_available,
533
- 'up_to_date': up_to_date,
534
- 'not_deployed': not_deployed,
535
- 'orphaned': orphaned
539
+ "updates_available": updates_available,
540
+ "up_to_date": up_to_date,
541
+ "not_deployed": not_deployed,
542
+ "orphaned": orphaned,
536
543
  }
537
544
 
538
545
  def update_skills(self, skill_names: Optional[List[str]] = None) -> Dict[str, Any]:
@@ -552,28 +559,29 @@ class SkillsService(LoggerMixin):
552
559
  if skill_names is None:
553
560
  # Get all skills with available updates
554
561
  check_result = self.check_for_updates()
555
- skill_names = [s['name'] for s in check_result['updates_available']]
562
+ skill_names = [s["name"] for s in check_result["updates_available"]]
556
563
 
557
564
  if not skill_names:
558
565
  self.logger.info("No skills to update")
559
- return {'updated': [], 'errors': []}
566
+ return {"updated": [], "errors": []}
560
567
 
561
568
  updated = []
562
569
  errors = []
563
570
 
564
- bundled = {s['name']: s for s in self.discover_bundled_skills()}
571
+ bundled = {s["name"]: s for s in self.discover_bundled_skills()}
565
572
 
566
573
  for skill_name in skill_names:
567
574
  if skill_name not in bundled:
568
- errors.append({
569
- 'skill': skill_name,
570
- 'error': 'Skill not found in bundled skills'
571
- })
575
+ errors.append(
576
+ {"skill": skill_name, "error": "Skill not found in bundled skills"}
577
+ )
572
578
  continue
573
579
 
574
580
  try:
575
581
  skill = bundled[skill_name]
576
- target_dir = self.deployed_skills_path / skill['category'] / skill['name']
582
+ target_dir = (
583
+ self.deployed_skills_path / skill["category"] / skill["name"]
584
+ )
577
585
 
578
586
  # SECURITY: Validate path is within deployed_skills_path
579
587
  if not self._validate_safe_path(self.deployed_skills_path, target_dir):
@@ -590,21 +598,20 @@ class SkillsService(LoggerMixin):
590
598
 
591
599
  # Deploy new version
592
600
  target_dir.parent.mkdir(parents=True, exist_ok=True)
593
- shutil.copytree(skill['path'], target_dir)
601
+ shutil.copytree(skill["path"], target_dir)
594
602
 
595
603
  updated.append(skill_name)
596
604
  self.logger.info(f"Updated skill: {skill_name}")
597
605
 
598
606
  except (ValueError, OSError) as e:
599
- errors.append({'skill': skill_name, 'error': str(e)})
607
+ errors.append({"skill": skill_name, "error": str(e)})
600
608
  self.logger.error(f"Failed to update {skill_name}: {e}")
601
609
 
602
- return {
603
- 'updated': updated,
604
- 'errors': errors
605
- }
610
+ return {"updated": updated, "errors": errors}
606
611
 
607
- def install_updates(self, updates: List[Dict[str, Any]], force: bool = False) -> Dict[str, Any]:
612
+ def install_updates(
613
+ self, updates: List[Dict[str, Any]], force: bool = False
614
+ ) -> Dict[str, Any]:
608
615
  """Install skill updates from update check results.
609
616
 
610
617
  Args:
@@ -614,7 +621,7 @@ class SkillsService(LoggerMixin):
614
621
  Returns:
615
622
  Dict containing updated skills and errors
616
623
  """
617
- skill_names = [update['skill'] for update in updates]
624
+ skill_names = [update["skill"] for update in updates]
618
625
  return self.update_skills(skill_names)
619
626
 
620
627
  def get_skill_path(self, skill_name: str) -> Optional[Path]:
@@ -647,20 +654,20 @@ class SkillsService(LoggerMixin):
647
654
  Dict with extracted metadata
648
655
  """
649
656
  metadata = {}
650
- lines = content.split('\n')
657
+ lines = content.split("\n")
651
658
 
652
659
  for line in lines[:50]: # Check first 50 lines for metadata
653
660
  line = line.strip()
654
661
 
655
662
  # Parse YAML-style metadata
656
- if line.startswith('version:'):
657
- metadata['version'] = line.split(':', 1)[1].strip()
658
- elif line.startswith('description:'):
659
- metadata['description'] = line.split(':', 1)[1].strip()
660
- elif line.startswith('category:'):
661
- metadata['category'] = line.split(':', 1)[1].strip()
662
- elif line.startswith('source:'):
663
- metadata['source'] = line.split(':', 1)[1].strip()
663
+ if line.startswith("version:"):
664
+ metadata["version"] = line.split(":", 1)[1].strip()
665
+ elif line.startswith("description:"):
666
+ metadata["description"] = line.split(":", 1)[1].strip()
667
+ elif line.startswith("category:"):
668
+ metadata["category"] = line.split(":", 1)[1].strip()
669
+ elif line.startswith("source:"):
670
+ metadata["source"] = line.split(":", 1)[1].strip()
664
671
 
665
672
  return metadata
666
673
 
@@ -676,10 +683,10 @@ class SkillsService(LoggerMixin):
676
683
  agents = []
677
684
  registry = self._load_registry()
678
685
 
679
- agent_capabilities = registry.get('agent_capabilities', {})
686
+ agent_capabilities = registry.get("agent_capabilities", {})
680
687
  for agent_id, capabilities in agent_capabilities.items():
681
- primary_workflows = capabilities.get('primary_workflows', [])
682
- enhanced_capabilities = capabilities.get('enhanced_capabilities', [])
688
+ primary_workflows = capabilities.get("primary_workflows", [])
689
+ enhanced_capabilities = capabilities.get("enhanced_capabilities", [])
683
690
  all_skills = primary_workflows + enhanced_capabilities
684
691
 
685
692
  if skill_name in all_skills:
@@ -698,7 +705,11 @@ class SkillsService(LoggerMixin):
698
705
  """
699
706
  if scope == "system":
700
707
  # System-wide config (bundled)
701
- return self.bundled_skills_path.parent.parent / "config" / "skills_registry.yaml"
708
+ return (
709
+ self.bundled_skills_path.parent.parent
710
+ / "config"
711
+ / "skills_registry.yaml"
712
+ )
702
713
  if scope == "user":
703
714
  # User config (~/.config/claude-mpm/)
704
715
  home = Path.home()
@@ -718,13 +729,11 @@ class SkillsService(LoggerMixin):
718
729
  config_path.parent.mkdir(parents=True, exist_ok=True)
719
730
 
720
731
  default_config = {
721
- 'version': '2.0.0',
722
- 'skills': {
723
- 'auto_deploy': True,
724
- 'update_check': True
725
- }
732
+ "version": "2.0.0",
733
+ "skills": {"auto_deploy": True, "update_check": True},
726
734
  }
727
735
 
728
736
  import yaml
737
+
729
738
  config_path.write_text(yaml.dump(default_config, default_flow_style=False))
730
739
  self.logger.info(f"Created default config at {config_path}")
@@ -0,0 +1,38 @@
1
+ """Structured question templates for common PM workflows.
2
+
3
+ This package provides reusable question templates that PM agents can use to gather
4
+ user input in a structured way. Templates are pre-configured QuestionSet objects
5
+ that can be customized based on context.
6
+
7
+ Available Templates:
8
+ - PR Strategy: Questions about PR workflow, draft preferences, auto-merge
9
+ - Project Initialization: Questions about project type, language, frameworks
10
+ - Ticket Management: Questions about ticket prioritization and scope
11
+
12
+ Example Usage:
13
+ >>> from claude_mpm.templates.questions.pr_strategy import PRWorkflowTemplate
14
+ >>> template = PRWorkflowTemplate(num_tickets=3)
15
+ >>> question_set = template.build()
16
+ >>> params = question_set.to_ask_user_question_params()
17
+ """
18
+
19
+ from claude_mpm.templates.questions.base import ConditionalTemplate, QuestionTemplate
20
+ from claude_mpm.templates.questions.pr_strategy import PRWorkflowTemplate
21
+ from claude_mpm.templates.questions.project_init import (
22
+ DevelopmentWorkflowTemplate,
23
+ ProjectTypeTemplate,
24
+ )
25
+ from claude_mpm.templates.questions.ticket_mgmt import (
26
+ TicketPrioritizationTemplate,
27
+ TicketScopeTemplate,
28
+ )
29
+
30
+ __all__ = [
31
+ "ConditionalTemplate",
32
+ "DevelopmentWorkflowTemplate",
33
+ "PRWorkflowTemplate",
34
+ "ProjectTypeTemplate",
35
+ "QuestionTemplate",
36
+ "TicketPrioritizationTemplate",
37
+ "TicketScopeTemplate",
38
+ ]