claude-mpm 4.24.0__py3-none-any.whl → 5.0.9__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 (502) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +721 -911
  5. claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
  6. claude_mpm/agents/WORKFLOW.md +4 -4
  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 → circuit-breakers.md} +370 -3
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
  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 +38 -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 +2 -6
  30. claude_mpm/cli/commands/config.py +7 -4
  31. claude_mpm/cli/commands/configure.py +769 -45
  32. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  33. claude_mpm/cli/commands/configure_navigation.py +63 -46
  34. claude_mpm/cli/commands/debug.py +12 -12
  35. claude_mpm/cli/commands/doctor.py +10 -2
  36. claude_mpm/cli/commands/hook_errors.py +277 -0
  37. claude_mpm/cli/commands/local_deploy.py +1 -4
  38. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  39. claude_mpm/cli/commands/mpm_init/core.py +49 -1
  40. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  41. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  42. claude_mpm/cli/commands/postmortem.py +401 -0
  43. claude_mpm/cli/commands/run.py +123 -165
  44. claude_mpm/cli/commands/skill_source.py +694 -0
  45. claude_mpm/cli/commands/skills.py +757 -20
  46. claude_mpm/cli/executor.py +78 -3
  47. claude_mpm/cli/interactive/agent_wizard.py +955 -45
  48. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  49. claude_mpm/cli/parsers/agents_parser.py +256 -4
  50. claude_mpm/cli/parsers/base_parser.py +53 -0
  51. claude_mpm/cli/parsers/config_parser.py +96 -43
  52. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  53. claude_mpm/cli/parsers/skills_parser.py +145 -0
  54. claude_mpm/cli/parsers/source_parser.py +138 -0
  55. claude_mpm/cli/startup.py +538 -106
  56. claude_mpm/cli/startup_display.py +480 -0
  57. claude_mpm/cli/utils.py +1 -1
  58. claude_mpm/cli_module/commands.py +1 -1
  59. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  60. claude_mpm/commands/mpm-agents-detect.md +9 -0
  61. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  62. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  63. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  64. claude_mpm/commands/mpm-doctor.md +9 -0
  65. claude_mpm/commands/mpm-help.md +14 -2
  66. claude_mpm/commands/mpm-init.md +27 -2
  67. claude_mpm/commands/mpm-monitor.md +9 -0
  68. claude_mpm/commands/mpm-postmortem.md +123 -0
  69. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  70. claude_mpm/commands/mpm-status.md +9 -0
  71. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  72. claude_mpm/commands/mpm-ticket-view.md +552 -0
  73. claude_mpm/commands/mpm-version.md +9 -0
  74. claude_mpm/commands/mpm.md +10 -0
  75. claude_mpm/config/agent_presets.py +488 -0
  76. claude_mpm/config/agent_sources.py +325 -0
  77. claude_mpm/config/skill_presets.py +392 -0
  78. claude_mpm/config/skill_sources.py +590 -0
  79. claude_mpm/constants.py +13 -0
  80. claude_mpm/core/claude_runner.py +5 -34
  81. claude_mpm/core/config.py +16 -0
  82. claude_mpm/core/constants.py +1 -1
  83. claude_mpm/core/framework/__init__.py +3 -16
  84. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  85. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  86. claude_mpm/core/hook_error_memory.py +381 -0
  87. claude_mpm/core/hook_manager.py +41 -2
  88. claude_mpm/core/interactive_session.py +91 -10
  89. claude_mpm/core/logger.py +3 -1
  90. claude_mpm/core/oneshot_session.py +71 -8
  91. claude_mpm/core/protocols/__init__.py +23 -0
  92. claude_mpm/core/protocols/runner_protocol.py +103 -0
  93. claude_mpm/core/protocols/session_protocol.py +131 -0
  94. claude_mpm/core/shared/singleton_manager.py +11 -4
  95. claude_mpm/core/system_context.py +38 -0
  96. claude_mpm/dashboard/static/css/activity.css +69 -69
  97. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  98. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  99. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  100. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  101. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  102. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  103. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  104. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  105. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  106. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  107. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  108. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  109. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  110. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  111. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  112. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  113. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  114. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  115. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  116. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  117. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  118. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  119. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  120. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  121. claude_mpm/dashboard/templates/code_simple.html +23 -23
  122. claude_mpm/dashboard/templates/index.html +18 -18
  123. claude_mpm/experimental/cli_enhancements.py +1 -5
  124. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  125. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  126. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  127. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  128. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  129. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  130. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  131. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  132. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  133. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  134. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  135. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  136. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  137. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  139. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  140. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  141. claude_mpm/models/git_repository.py +198 -0
  142. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  143. claude_mpm/scripts/start_activity_logging.py +3 -1
  144. claude_mpm/services/agents/agent_builder.py +45 -9
  145. claude_mpm/services/agents/agent_preset_service.py +238 -0
  146. claude_mpm/services/agents/agent_selection_service.py +484 -0
  147. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  148. claude_mpm/services/agents/cache_git_manager.py +621 -0
  149. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  150. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  151. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  152. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  153. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  154. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  155. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  156. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  157. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  158. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  159. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  160. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  161. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  162. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  163. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  164. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  165. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  166. claude_mpm/services/agents/git_source_manager.py +629 -0
  167. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  168. claude_mpm/services/agents/local_template_manager.py +50 -10
  169. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  170. claude_mpm/services/agents/sources/__init__.py +13 -0
  171. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  172. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  173. claude_mpm/services/agents/startup_sync.py +239 -0
  174. claude_mpm/services/agents/toolchain_detector.py +474 -0
  175. claude_mpm/services/analysis/__init__.py +25 -0
  176. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  177. claude_mpm/services/analysis/postmortem_service.py +765 -0
  178. claude_mpm/services/cli/session_pause_manager.py +1 -1
  179. claude_mpm/services/command_deployment_service.py +200 -6
  180. claude_mpm/services/core/base.py +7 -2
  181. claude_mpm/services/core/interfaces/__init__.py +1 -3
  182. claude_mpm/services/core/interfaces/health.py +1 -4
  183. claude_mpm/services/core/models/__init__.py +2 -11
  184. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  185. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  186. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  187. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  188. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  189. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  190. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  191. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  192. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  193. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  194. claude_mpm/services/event_bus/direct_relay.py +3 -3
  195. claude_mpm/services/events/consumers/logging.py +1 -2
  196. claude_mpm/services/git/__init__.py +21 -0
  197. claude_mpm/services/git/git_operations_service.py +494 -0
  198. claude_mpm/services/github/__init__.py +21 -0
  199. claude_mpm/services/github/github_cli_service.py +397 -0
  200. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  201. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  202. claude_mpm/services/instructions/__init__.py +9 -0
  203. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  204. claude_mpm/services/local_ops/__init__.py +3 -13
  205. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  206. claude_mpm/services/local_ops/health_manager.py +1 -4
  207. claude_mpm/services/local_ops/resource_monitor.py +1 -1
  208. claude_mpm/services/mcp_config_manager.py +75 -145
  209. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  210. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  211. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  212. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  213. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  214. claude_mpm/services/mcp_service_verifier.py +6 -3
  215. claude_mpm/services/model/model_router.py +1 -2
  216. claude_mpm/services/monitor/daemon.py +29 -9
  217. claude_mpm/services/monitor/daemon_manager.py +96 -19
  218. claude_mpm/services/monitor/server.py +2 -2
  219. claude_mpm/services/port_manager.py +1 -1
  220. claude_mpm/services/pr/__init__.py +14 -0
  221. claude_mpm/services/pr/pr_template_service.py +329 -0
  222. claude_mpm/services/project/documentation_manager.py +2 -1
  223. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  224. claude_mpm/services/runner_configuration_service.py +16 -3
  225. claude_mpm/services/session_management_service.py +16 -4
  226. claude_mpm/services/skills/__init__.py +18 -0
  227. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  228. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  229. claude_mpm/services/skills_config.py +547 -0
  230. claude_mpm/services/skills_deployer.py +955 -0
  231. claude_mpm/services/socketio/handlers/connection.py +1 -1
  232. claude_mpm/services/socketio/handlers/git.py +1 -1
  233. claude_mpm/services/socketio/server/core.py +1 -4
  234. claude_mpm/services/socketio/server/main.py +1 -3
  235. claude_mpm/services/system_instructions_service.py +1 -3
  236. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  237. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  238. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  239. claude_mpm/services/unified/unified_deployment.py +1 -5
  240. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  241. claude_mpm/services/visualization/__init__.py +1 -5
  242. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  243. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  244. claude_mpm/skills/skills_registry.py +0 -1
  245. claude_mpm/templates/questions/__init__.py +38 -0
  246. claude_mpm/templates/questions/base.py +193 -0
  247. claude_mpm/templates/questions/pr_strategy.py +311 -0
  248. claude_mpm/templates/questions/project_init.py +385 -0
  249. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  250. claude_mpm/tools/__main__.py +8 -8
  251. claude_mpm/utils/agent_dependency_loader.py +77 -10
  252. claude_mpm/utils/agent_filters.py +288 -0
  253. claude_mpm/utils/dependency_cache.py +3 -1
  254. claude_mpm/utils/gitignore.py +241 -0
  255. claude_mpm/utils/migration.py +372 -0
  256. claude_mpm/utils/progress.py +387 -0
  257. claude_mpm/utils/robust_installer.py +2 -4
  258. claude_mpm/utils/structured_questions.py +619 -0
  259. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/METADATA +396 -43
  260. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/RECORD +268 -422
  261. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  262. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  263. claude_mpm/agents/templates/agent-manager.json +0 -273
  264. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  265. claude_mpm/agents/templates/api_qa.json +0 -183
  266. claude_mpm/agents/templates/clerk-ops.json +0 -235
  267. claude_mpm/agents/templates/code_analyzer.json +0 -101
  268. claude_mpm/agents/templates/content-agent.json +0 -358
  269. claude_mpm/agents/templates/dart_engineer.json +0 -307
  270. claude_mpm/agents/templates/data_engineer.json +0 -225
  271. claude_mpm/agents/templates/documentation.json +0 -238
  272. claude_mpm/agents/templates/engineer.json +0 -210
  273. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  274. claude_mpm/agents/templates/golang_engineer.json +0 -270
  275. claude_mpm/agents/templates/imagemagick.json +0 -264
  276. claude_mpm/agents/templates/java_engineer.json +0 -346
  277. claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
  278. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  279. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  280. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  281. claude_mpm/agents/templates/memory_manager.json +0 -158
  282. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  283. claude_mpm/agents/templates/ops.json +0 -185
  284. claude_mpm/agents/templates/php-engineer.json +0 -287
  285. claude_mpm/agents/templates/product_owner.json +0 -338
  286. claude_mpm/agents/templates/project_organizer.json +0 -144
  287. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  288. claude_mpm/agents/templates/python_engineer.json +0 -387
  289. claude_mpm/agents/templates/qa.json +0 -243
  290. claude_mpm/agents/templates/react_engineer.json +0 -239
  291. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  292. claude_mpm/agents/templates/research.json +0 -188
  293. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  294. claude_mpm/agents/templates/rust_engineer.json +0 -275
  295. claude_mpm/agents/templates/security.json +0 -202
  296. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  297. claude_mpm/agents/templates/tauri_engineer.json +0 -274
  298. claude_mpm/agents/templates/ticketing.json +0 -178
  299. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  300. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  301. claude_mpm/agents/templates/version_control.json +0 -159
  302. claude_mpm/agents/templates/web_qa.json +0 -400
  303. claude_mpm/agents/templates/web_ui.json +0 -189
  304. claude_mpm/commands/mpm-tickets.md +0 -151
  305. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  306. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  307. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  308. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  309. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  310. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  311. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  312. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  313. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  314. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  315. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  316. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  317. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  318. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  319. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  320. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  321. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  322. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  323. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  324. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  325. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  326. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  327. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  328. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  329. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  330. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  331. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  332. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  333. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  334. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  335. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  336. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  337. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  338. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  339. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  340. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  341. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  343. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  344. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  345. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  346. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  347. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  349. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  351. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  352. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  353. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  354. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  355. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  357. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  358. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  359. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  360. claude_mpm/dashboard/static/built/react/events.js +0 -30
  361. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  362. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  363. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  364. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  365. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  366. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  367. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  368. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  369. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  370. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  382. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  383. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  384. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  385. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  388. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  389. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  390. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  391. claude_mpm/dashboard/static/events.html +0 -607
  392. claude_mpm/dashboard/static/index.html +0 -635
  393. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  394. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  395. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  396. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  397. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  398. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  399. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  400. claude_mpm/dashboard/static/legacy/files.html +0 -747
  401. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  402. claude_mpm/dashboard/static/monitors.html +0 -431
  403. claude_mpm/dashboard/static/production/events.html +0 -659
  404. claude_mpm/dashboard/static/production/main.html +0 -698
  405. claude_mpm/dashboard/static/production/monitors.html +0 -483
  406. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  407. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  408. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  409. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  410. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  411. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  412. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  413. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  414. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  415. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  416. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  417. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  418. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  419. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  420. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  421. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  422. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  423. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  424. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  425. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  426. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  427. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  432. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  433. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  434. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  435. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  436. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  437. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  438. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  439. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  440. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  441. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  442. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  443. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  444. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  445. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  446. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  447. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  448. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  449. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  450. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  451. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  452. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  453. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  454. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  455. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  456. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  457. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  458. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  459. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  460. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  461. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  462. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  463. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  464. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  465. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  466. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  467. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  468. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  469. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  470. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  471. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  472. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  473. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  474. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  475. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  476. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  477. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  478. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  479. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  480. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  481. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  482. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  483. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  484. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  485. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  486. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  487. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  488. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  489. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  490. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  491. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  492. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  493. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  494. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  495. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  496. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  497. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  498. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  499. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
  500. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +0 -0
  501. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
  502. {claude_mpm-4.24.0.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,311 @@
1
+ """PR Strategy question templates for PM workflow decisions.
2
+
3
+ This module provides templates for gathering user preferences about PR workflows,
4
+ including whether to use stacked PRs, draft PRs, and auto-merge settings.
5
+
6
+ Templates:
7
+ - PRWorkflowTemplate: Main PR workflow decisions (main-based vs stacked)
8
+ - DraftPRTemplate: Draft PR preferences
9
+ - AutoMergeTemplate: Auto-merge preferences
10
+
11
+ These templates are context-aware and only ask relevant questions based on the
12
+ number of tickets and project state.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ from typing import TYPE_CHECKING
18
+
19
+ from claude_mpm.templates.questions.base import ConditionalTemplate
20
+ from claude_mpm.utils.structured_questions import QuestionBuilder, QuestionSet
21
+
22
+ if TYPE_CHECKING:
23
+ from claude_mpm.utils.structured_questions import StructuredQuestion
24
+
25
+
26
+ class PRWorkflowTemplate(ConditionalTemplate):
27
+ """Template for PR workflow strategy questions.
28
+
29
+ Asks questions about:
30
+ - Main-based vs stacked PRs (only if multiple tickets)
31
+ - Draft PR preference
32
+ - Auto-merge preference
33
+
34
+ Context Parameters:
35
+ num_tickets (int): Number of tickets being worked on
36
+ has_ci (bool): Whether project has CI/CD setup (affects auto-merge question)
37
+
38
+ Example:
39
+ >>> template = PRWorkflowTemplate(num_tickets=3, has_ci=True)
40
+ >>> question_set = template.build()
41
+ >>> params = question_set.to_ask_user_question_params()
42
+ """
43
+
44
+ def __init__(self, num_tickets: int = 1, has_ci: bool = False, **context):
45
+ """Initialize PR workflow template.
46
+
47
+ Args:
48
+ num_tickets: Number of tickets in this sprint/batch
49
+ has_ci: Whether CI/CD is configured
50
+ **context: Additional context values
51
+ """
52
+ super().__init__(num_tickets=num_tickets, has_ci=has_ci, **context)
53
+
54
+ def should_include_question(self, question_id: str) -> bool:
55
+ """Determine which questions to ask based on context.
56
+
57
+ Args:
58
+ question_id: Question identifier
59
+ - "workflow": Main vs stacked PRs
60
+ - "draft": Draft PR preference
61
+ - "auto_merge": Auto-merge preference
62
+
63
+ Returns:
64
+ True if question should be included
65
+ """
66
+ num_tickets = self.get_context("num_tickets", 1)
67
+ has_ci = self.get_context("has_ci", False)
68
+
69
+ if question_id == "workflow":
70
+ # Only ask about stacked vs main-based if multiple tickets
71
+ return num_tickets > 1
72
+
73
+ if question_id == "draft":
74
+ # Always relevant
75
+ return True
76
+
77
+ if question_id == "auto_merge":
78
+ # Only ask about auto-merge if CI is configured
79
+ return has_ci
80
+
81
+ return True
82
+
83
+ def build(self) -> QuestionSet:
84
+ """Build PR workflow questions based on context.
85
+
86
+ Returns:
87
+ QuestionSet with relevant PR workflow questions
88
+ """
89
+ questions: list[StructuredQuestion] = []
90
+
91
+ # Question 1: PR workflow strategy (only if multiple tickets)
92
+ if self.should_include_question("workflow"):
93
+ workflow_question = (
94
+ QuestionBuilder()
95
+ .ask("How should we organize the pull requests?")
96
+ .header("PR Strategy")
97
+ .add_option(
98
+ "Main-based PRs",
99
+ "Each ticket gets its own PR against main branch (parallel work)",
100
+ )
101
+ .add_option(
102
+ "Stacked PRs",
103
+ "PRs build on each other sequentially (ticket-1 → ticket-2 → ticket-3)",
104
+ )
105
+ .build()
106
+ )
107
+ questions.append(workflow_question)
108
+
109
+ # Question 2: Draft PR preference
110
+ if self.should_include_question("draft"):
111
+ draft_question = (
112
+ QuestionBuilder()
113
+ .ask("Should PRs be created as drafts initially?")
114
+ .header("Draft PRs")
115
+ .add_option(
116
+ "Yes, as drafts",
117
+ "Create as draft PRs, mark ready when implementation complete",
118
+ )
119
+ .add_option(
120
+ "No, ready for review",
121
+ "Create as regular PRs ready for immediate review",
122
+ )
123
+ .build()
124
+ )
125
+ questions.append(draft_question)
126
+
127
+ # Question 3: Auto-merge preference (only if CI configured)
128
+ if self.should_include_question("auto_merge"):
129
+ automerge_question = (
130
+ QuestionBuilder()
131
+ .ask("Should PRs auto-merge after CI passes and approval?")
132
+ .header("Auto-merge")
133
+ .add_option(
134
+ "Enable auto-merge",
135
+ "PRs merge automatically after CI passes and approval received",
136
+ )
137
+ .add_option(
138
+ "Manual merge only",
139
+ "PRs require manual merge even after approval",
140
+ )
141
+ .build()
142
+ )
143
+ questions.append(automerge_question)
144
+
145
+ if not questions:
146
+ # Fallback: at least ask about draft preference
147
+ questions.append(
148
+ QuestionBuilder()
149
+ .ask("Should PRs be created as drafts initially?")
150
+ .header("Draft PRs")
151
+ .add_option(
152
+ "Yes, as drafts",
153
+ "Create as draft PRs, mark ready when implementation complete",
154
+ )
155
+ .add_option(
156
+ "No, ready for review",
157
+ "Create as regular PRs ready for immediate review",
158
+ )
159
+ .build()
160
+ )
161
+
162
+ return QuestionSet(questions)
163
+
164
+
165
+ class PRSizeTemplate(ConditionalTemplate):
166
+ """Template for PR size and scope preferences.
167
+
168
+ Asks about preferred PR size and whether to split large changes.
169
+
170
+ Context Parameters:
171
+ estimated_changes (int): Estimated lines of code changed
172
+
173
+ Example:
174
+ >>> template = PRSizeTemplate(estimated_changes=500)
175
+ >>> question_set = template.build()
176
+ """
177
+
178
+ def __init__(self, estimated_changes: int = 0, **context):
179
+ """Initialize PR size template.
180
+
181
+ Args:
182
+ estimated_changes: Estimated LOC changes
183
+ **context: Additional context values
184
+ """
185
+ super().__init__(estimated_changes=estimated_changes, **context)
186
+
187
+ def build(self) -> QuestionSet:
188
+ """Build PR size preference questions.
189
+
190
+ Returns:
191
+ QuestionSet with PR size questions
192
+ """
193
+ estimated_changes = self.get_context("estimated_changes", 0)
194
+
195
+ questions: list[StructuredQuestion] = []
196
+
197
+ # Only ask if changes are large
198
+ if estimated_changes > 300:
199
+ size_question = (
200
+ QuestionBuilder()
201
+ .ask(
202
+ "This feature involves significant changes. How should we split it?"
203
+ )
204
+ .header("PR Size")
205
+ .add_option(
206
+ "Single large PR",
207
+ "Keep all changes together in one comprehensive PR",
208
+ )
209
+ .add_option(
210
+ "Split by component",
211
+ "Create separate PRs for each major component",
212
+ )
213
+ .add_option(
214
+ "Split by feature",
215
+ "Create separate PRs for each sub-feature",
216
+ )
217
+ .build()
218
+ )
219
+ questions.append(size_question)
220
+
221
+ # Fallback if no size concerns
222
+ if not questions:
223
+ commit_question = (
224
+ QuestionBuilder()
225
+ .ask("How should commits be organized?")
226
+ .header("Commits")
227
+ .add_option(
228
+ "Atomic commits",
229
+ "Many small, focused commits (one per logical change)",
230
+ )
231
+ .add_option(
232
+ "Feature commits",
233
+ "Fewer, larger commits (one per feature/component)",
234
+ )
235
+ .build()
236
+ )
237
+ questions.append(commit_question)
238
+
239
+ return QuestionSet(questions)
240
+
241
+
242
+ class PRReviewTemplate(ConditionalTemplate):
243
+ """Template for PR review and approval preferences.
244
+
245
+ Asks about reviewer assignment, approval requirements, and review timing.
246
+
247
+ Context Parameters:
248
+ team_size (int): Number of team members
249
+ is_critical (bool): Whether this is a critical/sensitive change
250
+
251
+ Example:
252
+ >>> template = PRReviewTemplate(team_size=5, is_critical=True)
253
+ >>> question_set = template.build()
254
+ """
255
+
256
+ def __init__(self, team_size: int = 1, is_critical: bool = False, **context):
257
+ """Initialize PR review template.
258
+
259
+ Args:
260
+ team_size: Number of team members available for review
261
+ is_critical: Whether changes are critical/sensitive
262
+ **context: Additional context values
263
+ """
264
+ super().__init__(team_size=team_size, is_critical=is_critical, **context)
265
+
266
+ def build(self) -> QuestionSet:
267
+ """Build PR review preference questions.
268
+
269
+ Returns:
270
+ QuestionSet with PR review questions
271
+ """
272
+ team_size = self.get_context("team_size", 1)
273
+
274
+ questions: list[StructuredQuestion] = []
275
+
276
+ # Question about number of approvals required
277
+ if team_size > 1:
278
+ approval_question = (
279
+ QuestionBuilder()
280
+ .ask("How many approvals should be required before merging?")
281
+ .header("Approvals")
282
+ .add_option(
283
+ "1 approval",
284
+ "Single approval sufficient (faster iteration)",
285
+ )
286
+ .add_option(
287
+ "2 approvals",
288
+ "Two approvals required (more thorough review)",
289
+ )
290
+ .build()
291
+ )
292
+ questions.append(approval_question)
293
+
294
+ # Question about review timing
295
+ timing_question = (
296
+ QuestionBuilder()
297
+ .ask("When should review be requested?")
298
+ .header("Review When")
299
+ .add_option(
300
+ "After implementation",
301
+ "Request review only when all code is complete",
302
+ )
303
+ .add_option(
304
+ "Early feedback",
305
+ "Request early review for approach validation",
306
+ )
307
+ .build()
308
+ )
309
+ questions.append(timing_question)
310
+
311
+ return QuestionSet(questions)
@@ -0,0 +1,385 @@
1
+ """Project initialization question templates.
2
+
3
+ This module provides templates for gathering information during project setup,
4
+ including project type, language, frameworks, and development workflow preferences.
5
+
6
+ Templates:
7
+ - ProjectTypeTemplate: Project type and primary language selection
8
+ - DevelopmentWorkflowTemplate: Testing, CI/CD, and development preferences
9
+ - FrameworkTemplate: Framework and library selection
10
+
11
+ These templates help PM gather necessary context during /mpm-init or new project setup.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from typing import TYPE_CHECKING
17
+
18
+ from claude_mpm.templates.questions.base import ConditionalTemplate
19
+ from claude_mpm.utils.structured_questions import QuestionBuilder, QuestionSet
20
+
21
+ if TYPE_CHECKING:
22
+ from claude_mpm.utils.structured_questions import StructuredQuestion
23
+
24
+
25
+ class ProjectTypeTemplate(ConditionalTemplate):
26
+ """Template for project type and language selection.
27
+
28
+ Asks about:
29
+ - Project type (web app, API, library, etc.)
30
+ - Primary programming language
31
+ - Target deployment environment (optional, based on type)
32
+
33
+ Context Parameters:
34
+ existing_files (bool): Whether project has existing files
35
+ detected_language (str): Auto-detected language if any
36
+
37
+ Example:
38
+ >>> template = ProjectTypeTemplate(existing_files=False)
39
+ >>> question_set = template.build()
40
+ """
41
+
42
+ def __init__(
43
+ self,
44
+ existing_files: bool = False,
45
+ detected_language: str | None = None,
46
+ **context,
47
+ ):
48
+ """Initialize project type template.
49
+
50
+ Args:
51
+ existing_files: Whether project directory has existing files
52
+ detected_language: Language auto-detected from existing files
53
+ **context: Additional context values
54
+ """
55
+ super().__init__(
56
+ existing_files=existing_files,
57
+ detected_language=detected_language,
58
+ **context,
59
+ )
60
+
61
+ def build(self) -> QuestionSet:
62
+ """Build project type questions.
63
+
64
+ Returns:
65
+ QuestionSet with project type questions
66
+ """
67
+ detected_language = self.get_context("detected_language")
68
+
69
+ questions: list[StructuredQuestion] = []
70
+
71
+ # Question 1: Project type
72
+ type_question = (
73
+ QuestionBuilder()
74
+ .ask("What type of project is this?")
75
+ .header("Project Type")
76
+ .add_option(
77
+ "Web Application",
78
+ "Full-stack web app with frontend and backend",
79
+ )
80
+ .add_option(
81
+ "API Service",
82
+ "Backend API or microservice",
83
+ )
84
+ .add_option(
85
+ "Library/Package",
86
+ "Reusable library or package for distribution",
87
+ )
88
+ .add_option(
89
+ "CLI Tool",
90
+ "Command-line application or tool",
91
+ )
92
+ .build()
93
+ )
94
+ questions.append(type_question)
95
+
96
+ # Question 2: Primary language (only if not detected)
97
+ if not detected_language:
98
+ language_question = (
99
+ QuestionBuilder()
100
+ .ask("What is the primary programming language?")
101
+ .header("Language")
102
+ .add_option(
103
+ "Python",
104
+ "Python 3.8+ for backend, scripts, or data processing",
105
+ )
106
+ .add_option(
107
+ "JavaScript/TypeScript",
108
+ "JavaScript or TypeScript for Node.js or full-stack",
109
+ )
110
+ .add_option(
111
+ "Go",
112
+ "Go for high-performance services and tools",
113
+ )
114
+ .add_option(
115
+ "Rust",
116
+ "Rust for systems programming and performance-critical code",
117
+ )
118
+ .build()
119
+ )
120
+ questions.append(language_question)
121
+
122
+ return QuestionSet(questions)
123
+
124
+
125
+ class DevelopmentWorkflowTemplate(ConditionalTemplate):
126
+ """Template for development workflow preferences.
127
+
128
+ Asks about:
129
+ - Testing framework and coverage requirements
130
+ - CI/CD setup preferences
131
+ - Code quality tools
132
+ - Documentation approach
133
+
134
+ Context Parameters:
135
+ project_type (str): Type of project (from ProjectTypeTemplate)
136
+ language (str): Primary language (affects tool choices)
137
+
138
+ Example:
139
+ >>> template = DevelopmentWorkflowTemplate(
140
+ ... project_type="API Service",
141
+ ... language="Python"
142
+ ... )
143
+ >>> question_set = template.build()
144
+ """
145
+
146
+ def __init__(
147
+ self,
148
+ project_type: str | None = None,
149
+ language: str | None = None,
150
+ **context,
151
+ ):
152
+ """Initialize development workflow template.
153
+
154
+ Args:
155
+ project_type: Type of project being set up
156
+ language: Primary programming language
157
+ **context: Additional context values
158
+ """
159
+ super().__init__(project_type=project_type, language=language, **context)
160
+
161
+ def build(self) -> QuestionSet:
162
+ """Build development workflow questions.
163
+
164
+ Returns:
165
+ QuestionSet with workflow questions
166
+ """
167
+ language = self.get_context("language", "").lower()
168
+
169
+ questions: list[StructuredQuestion] = []
170
+
171
+ # Question 1: Testing approach
172
+ if "python" in language:
173
+ testing_question = (
174
+ QuestionBuilder()
175
+ .ask("What testing framework should we use?")
176
+ .header("Testing")
177
+ .add_option(
178
+ "pytest",
179
+ "Modern, feature-rich testing with fixtures and plugins",
180
+ )
181
+ .add_option(
182
+ "unittest",
183
+ "Python's built-in testing framework (standard library)",
184
+ )
185
+ .build()
186
+ )
187
+ elif "javascript" in language or "typescript" in language:
188
+ testing_question = (
189
+ QuestionBuilder()
190
+ .ask("What testing framework should we use?")
191
+ .header("Testing")
192
+ .add_option(
193
+ "Jest",
194
+ "Popular, batteries-included testing framework",
195
+ )
196
+ .add_option(
197
+ "Vitest",
198
+ "Fast, modern testing with native ESM support",
199
+ )
200
+ .build()
201
+ )
202
+ else:
203
+ # Generic testing question
204
+ testing_question = (
205
+ QuestionBuilder()
206
+ .ask("What level of test coverage should we target?")
207
+ .header("Testing")
208
+ .add_option(
209
+ "High coverage (80%+)",
210
+ "Comprehensive testing with strict coverage requirements",
211
+ )
212
+ .add_option(
213
+ "Moderate coverage (60%+)",
214
+ "Good testing balance between speed and thoroughness",
215
+ )
216
+ .build()
217
+ )
218
+ questions.append(testing_question)
219
+
220
+ # Question 2: CI/CD setup
221
+ cicd_question = (
222
+ QuestionBuilder()
223
+ .ask("Should we set up CI/CD from the start?")
224
+ .header("CI/CD")
225
+ .add_option(
226
+ "Yes, with GitHub Actions",
227
+ "Automated testing and deployment using GitHub Actions",
228
+ )
229
+ .add_option(
230
+ "Yes, with GitLab CI",
231
+ "Automated testing and deployment using GitLab CI",
232
+ )
233
+ .add_option(
234
+ "Not yet",
235
+ "Set up CI/CD later when project is more mature",
236
+ )
237
+ .build()
238
+ )
239
+ questions.append(cicd_question)
240
+
241
+ return QuestionSet(questions)
242
+
243
+
244
+ class FrameworkTemplate(ConditionalTemplate):
245
+ """Template for framework and library selection.
246
+
247
+ Asks about specific frameworks based on project type and language.
248
+
249
+ Context Parameters:
250
+ project_type (str): Type of project
251
+ language (str): Primary language
252
+
253
+ Example:
254
+ >>> template = FrameworkTemplate(
255
+ ... project_type="Web Application",
256
+ ... language="Python"
257
+ ... )
258
+ >>> question_set = template.build()
259
+ """
260
+
261
+ def __init__(
262
+ self,
263
+ project_type: str | None = None,
264
+ language: str | None = None,
265
+ **context,
266
+ ):
267
+ """Initialize framework template.
268
+
269
+ Args:
270
+ project_type: Type of project being set up
271
+ language: Primary programming language
272
+ **context: Additional context values
273
+ """
274
+ super().__init__(project_type=project_type, language=language, **context)
275
+
276
+ def build(self) -> QuestionSet:
277
+ """Build framework selection questions.
278
+
279
+ Returns:
280
+ QuestionSet with framework questions
281
+ """
282
+ language = self.get_context("language", "").lower()
283
+ project_type = self.get_context("project_type", "").lower()
284
+
285
+ questions: list[StructuredQuestion] = []
286
+
287
+ # Python web frameworks
288
+ if "python" in language and ("web" in project_type or "api" in project_type):
289
+ framework_question = (
290
+ QuestionBuilder()
291
+ .ask("Which Python web framework should we use?")
292
+ .header("Framework")
293
+ .add_option(
294
+ "FastAPI",
295
+ "Modern, fast framework with automatic API documentation",
296
+ )
297
+ .add_option(
298
+ "Flask",
299
+ "Lightweight, flexible micro-framework",
300
+ )
301
+ .add_option(
302
+ "Django",
303
+ "Full-featured framework with batteries included",
304
+ )
305
+ .build()
306
+ )
307
+ questions.append(framework_question)
308
+
309
+ # JavaScript/TypeScript frameworks
310
+ elif (
311
+ "javascript" in language or "typescript" in language
312
+ ) and "web" in project_type:
313
+ framework_question = (
314
+ QuestionBuilder()
315
+ .ask("Which frontend framework should we use?")
316
+ .header("Framework")
317
+ .add_option(
318
+ "React",
319
+ "Popular, component-based UI library with large ecosystem",
320
+ )
321
+ .add_option(
322
+ "Vue",
323
+ "Progressive framework with gentle learning curve",
324
+ )
325
+ .add_option(
326
+ "Next.js",
327
+ "React framework with SSR, routing, and optimization",
328
+ )
329
+ .add_option(
330
+ "Svelte",
331
+ "Compiled framework with minimal runtime overhead",
332
+ )
333
+ .build()
334
+ )
335
+ questions.append(framework_question)
336
+
337
+ # Database selection for API/web projects
338
+ if "api" in project_type or "web" in project_type:
339
+ database_question = (
340
+ QuestionBuilder()
341
+ .ask("What database should we use?")
342
+ .header("Database")
343
+ .add_option(
344
+ "PostgreSQL",
345
+ "Robust relational database with advanced features",
346
+ )
347
+ .add_option(
348
+ "MongoDB",
349
+ "Flexible NoSQL document database",
350
+ )
351
+ .add_option(
352
+ "SQLite",
353
+ "Lightweight embedded database (good for prototypes)",
354
+ )
355
+ .add_option(
356
+ "Redis",
357
+ "In-memory data store for caching and real-time features",
358
+ )
359
+ .build()
360
+ )
361
+ questions.append(database_question)
362
+
363
+ # Fallback if no specific framework questions
364
+ if not questions:
365
+ tooling_question = (
366
+ QuestionBuilder()
367
+ .ask("What development tools should we prioritize?")
368
+ .header("Tooling")
369
+ .add_option(
370
+ "Code quality",
371
+ "Linters, formatters, and static analysis tools",
372
+ )
373
+ .add_option(
374
+ "Testing",
375
+ "Comprehensive testing framework and coverage tools",
376
+ )
377
+ .add_option(
378
+ "Documentation",
379
+ "API docs, code docs, and documentation generators",
380
+ )
381
+ .build()
382
+ )
383
+ questions.append(tooling_question)
384
+
385
+ return QuestionSet(questions)