claude-mpm 4.21.3__py3-none-any.whl → 5.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +632 -334
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/__init__.py +6 -0
  7. claude_mpm/agents/agent_loader.py +1 -4
  8. claude_mpm/agents/base_agent.json +6 -3
  9. claude_mpm/agents/frontmatter_validator.py +1 -1
  10. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  11. claude_mpm/agents/templates/context-management-examples.md +544 -0
  12. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  13. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  14. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  15. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  16. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  17. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  18. claude_mpm/cli/__init__.py +38 -2
  19. claude_mpm/cli/commands/agent_source.py +774 -0
  20. claude_mpm/cli/commands/agent_state_manager.py +125 -20
  21. claude_mpm/cli/commands/agents.py +684 -13
  22. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  23. claude_mpm/cli/commands/agents_discover.py +338 -0
  24. claude_mpm/cli/commands/aggregate.py +1 -1
  25. claude_mpm/cli/commands/analyze.py +3 -3
  26. claude_mpm/cli/commands/auto_configure.py +2 -6
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/config.py +7 -4
  29. claude_mpm/cli/commands/configure.py +478 -44
  30. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  31. claude_mpm/cli/commands/configure_navigation.py +63 -46
  32. claude_mpm/cli/commands/debug.py +12 -12
  33. claude_mpm/cli/commands/doctor.py +10 -2
  34. claude_mpm/cli/commands/hook_errors.py +277 -0
  35. claude_mpm/cli/commands/local_deploy.py +1 -4
  36. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  37. claude_mpm/cli/commands/mpm_init/core.py +50 -2
  38. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  39. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  40. claude_mpm/cli/commands/run.py +124 -128
  41. claude_mpm/cli/commands/skill_source.py +694 -0
  42. claude_mpm/cli/commands/skills.py +435 -1
  43. claude_mpm/cli/executor.py +78 -3
  44. claude_mpm/cli/interactive/agent_wizard.py +919 -41
  45. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  46. claude_mpm/cli/parsers/agents_parser.py +173 -4
  47. claude_mpm/cli/parsers/base_parser.py +49 -0
  48. claude_mpm/cli/parsers/config_parser.py +96 -43
  49. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  50. claude_mpm/cli/parsers/skills_parser.py +138 -0
  51. claude_mpm/cli/parsers/source_parser.py +138 -0
  52. claude_mpm/cli/startup.py +499 -84
  53. claude_mpm/cli/startup_display.py +480 -0
  54. claude_mpm/cli/utils.py +1 -1
  55. claude_mpm/cli_module/commands.py +1 -1
  56. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  57. claude_mpm/commands/mpm-agents-detect.md +9 -0
  58. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  59. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  60. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  61. claude_mpm/commands/mpm-doctor.md +9 -0
  62. claude_mpm/commands/mpm-help.md +11 -2
  63. claude_mpm/commands/mpm-init.md +27 -2
  64. claude_mpm/commands/mpm-monitor.md +9 -0
  65. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  66. claude_mpm/commands/mpm-status.md +9 -0
  67. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  68. claude_mpm/commands/mpm-ticket-view.md +552 -0
  69. claude_mpm/commands/mpm-version.md +9 -0
  70. claude_mpm/commands/mpm.md +10 -0
  71. claude_mpm/config/agent_presets.py +258 -0
  72. claude_mpm/config/agent_sources.py +325 -0
  73. claude_mpm/config/skill_sources.py +590 -0
  74. claude_mpm/constants.py +12 -0
  75. claude_mpm/core/api_validator.py +1 -1
  76. claude_mpm/core/claude_runner.py +17 -10
  77. claude_mpm/core/config.py +24 -0
  78. claude_mpm/core/constants.py +1 -1
  79. claude_mpm/core/framework/__init__.py +3 -16
  80. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  81. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  82. claude_mpm/core/hook_error_memory.py +381 -0
  83. claude_mpm/core/hook_manager.py +41 -2
  84. claude_mpm/core/interactive_session.py +112 -5
  85. claude_mpm/core/logger.py +3 -1
  86. claude_mpm/core/oneshot_session.py +94 -4
  87. claude_mpm/dashboard/static/css/activity.css +69 -69
  88. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  89. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  90. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  91. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  92. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  93. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  94. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  95. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  96. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  97. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  98. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  99. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  100. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  101. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  102. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  103. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  104. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  105. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  106. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  107. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  108. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  109. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  110. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  111. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  112. claude_mpm/dashboard/templates/code_simple.html +23 -23
  113. claude_mpm/dashboard/templates/index.html +18 -18
  114. claude_mpm/experimental/cli_enhancements.py +1 -5
  115. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  116. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  117. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  118. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  119. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  120. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  121. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  122. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  123. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  124. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  125. claude_mpm/models/git_repository.py +198 -0
  126. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  127. claude_mpm/scripts/start_activity_logging.py +3 -1
  128. claude_mpm/services/agents/agent_builder.py +45 -9
  129. claude_mpm/services/agents/agent_preset_service.py +238 -0
  130. claude_mpm/services/agents/agent_selection_service.py +484 -0
  131. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  132. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  133. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  134. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  135. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  136. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  137. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  138. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  139. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  140. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  141. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  142. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  143. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  144. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  145. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  146. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  147. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  148. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  149. claude_mpm/services/agents/git_source_manager.py +629 -0
  150. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  151. claude_mpm/services/agents/local_template_manager.py +50 -10
  152. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  153. claude_mpm/services/agents/sources/__init__.py +13 -0
  154. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  155. claude_mpm/services/agents/sources/git_source_sync_service.py +1055 -0
  156. claude_mpm/services/agents/startup_sync.py +239 -0
  157. claude_mpm/services/agents/toolchain_detector.py +474 -0
  158. claude_mpm/services/cli/session_pause_manager.py +1 -1
  159. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  160. claude_mpm/services/command_deployment_service.py +92 -1
  161. claude_mpm/services/core/interfaces/__init__.py +1 -3
  162. claude_mpm/services/core/interfaces/health.py +1 -4
  163. claude_mpm/services/core/models/__init__.py +2 -11
  164. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  165. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  166. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  167. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  168. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  169. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  170. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  171. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  172. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  173. claude_mpm/services/event_bus/direct_relay.py +3 -3
  174. claude_mpm/services/event_bus/event_bus.py +36 -3
  175. claude_mpm/services/events/consumers/logging.py +1 -2
  176. claude_mpm/services/git/__init__.py +21 -0
  177. claude_mpm/services/git/git_operations_service.py +494 -0
  178. claude_mpm/services/github/__init__.py +21 -0
  179. claude_mpm/services/github/github_cli_service.py +397 -0
  180. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  181. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  182. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  183. claude_mpm/services/instructions/__init__.py +9 -0
  184. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  185. claude_mpm/services/local_ops/__init__.py +3 -13
  186. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  187. claude_mpm/services/local_ops/health_manager.py +1 -4
  188. claude_mpm/services/local_ops/process_manager.py +1 -1
  189. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  190. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  191. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  192. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  193. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  194. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  195. claude_mpm/services/memory/optimizer.py +1 -1
  196. claude_mpm/services/model/model_router.py +8 -9
  197. claude_mpm/services/monitor/daemon.py +1 -1
  198. claude_mpm/services/monitor/server.py +2 -2
  199. claude_mpm/services/native_agent_converter.py +356 -0
  200. claude_mpm/services/port_manager.py +1 -1
  201. claude_mpm/services/pr/__init__.py +14 -0
  202. claude_mpm/services/pr/pr_template_service.py +329 -0
  203. claude_mpm/services/project/documentation_manager.py +2 -1
  204. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  205. claude_mpm/services/runner_configuration_service.py +1 -0
  206. claude_mpm/services/self_upgrade_service.py +165 -7
  207. claude_mpm/services/skills/__init__.py +18 -0
  208. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  209. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  210. claude_mpm/services/skills_config.py +547 -0
  211. claude_mpm/services/skills_deployer.py +955 -0
  212. claude_mpm/services/socketio/handlers/connection.py +1 -1
  213. claude_mpm/services/socketio/handlers/git.py +2 -2
  214. claude_mpm/services/socketio/server/core.py +1 -4
  215. claude_mpm/services/socketio/server/main.py +1 -3
  216. claude_mpm/services/system_instructions_service.py +1 -3
  217. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  218. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  219. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  220. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  221. claude_mpm/services/unified/unified_deployment.py +1 -5
  222. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  223. claude_mpm/services/visualization/__init__.py +1 -5
  224. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  225. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  226. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  227. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  228. claude_mpm/skills/skills_registry.py +0 -1
  229. claude_mpm/templates/questions/__init__.py +38 -0
  230. claude_mpm/templates/questions/base.py +193 -0
  231. claude_mpm/templates/questions/pr_strategy.py +311 -0
  232. claude_mpm/templates/questions/project_init.py +385 -0
  233. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  234. claude_mpm/tools/__main__.py +8 -8
  235. claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
  236. claude_mpm/utils/agent_dependency_loader.py +80 -13
  237. claude_mpm/utils/dependency_cache.py +3 -1
  238. claude_mpm/utils/gitignore.py +241 -0
  239. claude_mpm/utils/log_cleanup.py +3 -3
  240. claude_mpm/utils/progress.py +383 -0
  241. claude_mpm/utils/robust_installer.py +3 -5
  242. claude_mpm/utils/structured_questions.py +619 -0
  243. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
  244. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +252 -425
  245. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  246. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  247. claude_mpm/agents/templates/agent-manager.json +0 -273
  248. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  249. claude_mpm/agents/templates/api_qa.json +0 -180
  250. claude_mpm/agents/templates/clerk-ops.json +0 -235
  251. claude_mpm/agents/templates/code_analyzer.json +0 -101
  252. claude_mpm/agents/templates/content-agent.json +0 -358
  253. claude_mpm/agents/templates/dart_engineer.json +0 -307
  254. claude_mpm/agents/templates/data_engineer.json +0 -225
  255. claude_mpm/agents/templates/documentation.json +0 -211
  256. claude_mpm/agents/templates/engineer.json +0 -210
  257. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  258. claude_mpm/agents/templates/golang_engineer.json +0 -270
  259. claude_mpm/agents/templates/imagemagick.json +0 -264
  260. claude_mpm/agents/templates/java_engineer.json +0 -346
  261. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  262. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  263. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  264. claude_mpm/agents/templates/memory_manager.json +0 -158
  265. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  266. claude_mpm/agents/templates/ops.json +0 -185
  267. claude_mpm/agents/templates/php-engineer.json +0 -287
  268. claude_mpm/agents/templates/product_owner.json +0 -338
  269. claude_mpm/agents/templates/project_organizer.json +0 -140
  270. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  271. claude_mpm/agents/templates/python_engineer.json +0 -387
  272. claude_mpm/agents/templates/qa.json +0 -242
  273. claude_mpm/agents/templates/react_engineer.json +0 -238
  274. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  275. claude_mpm/agents/templates/research.json +0 -188
  276. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  277. claude_mpm/agents/templates/rust_engineer.json +0 -275
  278. claude_mpm/agents/templates/security.json +0 -202
  279. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  280. claude_mpm/agents/templates/ticketing.json +0 -177
  281. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  282. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  283. claude_mpm/agents/templates/version_control.json +0 -157
  284. claude_mpm/agents/templates/web_qa.json +0 -399
  285. claude_mpm/agents/templates/web_ui.json +0 -189
  286. claude_mpm/commands/mpm-tickets.md +0 -102
  287. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  288. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  289. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  290. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  291. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  292. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  293. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  294. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  295. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  296. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  297. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  298. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  299. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  300. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  301. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  302. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  303. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  304. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  305. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  306. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  307. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  308. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  309. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  310. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  311. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  312. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  313. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  314. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  315. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  316. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  317. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  318. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  319. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  320. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  321. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  322. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  323. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  324. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  325. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  326. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  327. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  328. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  329. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  330. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  331. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  332. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  333. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  334. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  335. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  336. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  337. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  338. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  339. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  340. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  341. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  342. claude_mpm/dashboard/static/built/react/events.js +0 -30
  343. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  344. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  345. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  346. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  347. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  348. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  349. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  350. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  351. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  352. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  353. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  354. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  355. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  356. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  357. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  358. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  359. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  360. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  361. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  362. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  363. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  364. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  365. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  366. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  367. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  368. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  369. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  370. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  371. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  372. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  373. claude_mpm/dashboard/static/events.html +0 -607
  374. claude_mpm/dashboard/static/index.html +0 -635
  375. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  376. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  377. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  378. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  379. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  380. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  381. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  382. claude_mpm/dashboard/static/legacy/files.html +0 -747
  383. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  384. claude_mpm/dashboard/static/monitors.html +0 -431
  385. claude_mpm/dashboard/static/production/events.html +0 -659
  386. claude_mpm/dashboard/static/production/main.html +0 -698
  387. claude_mpm/dashboard/static/production/monitors.html +0 -483
  388. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  389. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  390. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  391. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  392. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  393. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  394. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  395. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  396. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  397. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  398. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  399. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  400. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  401. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  402. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  403. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  404. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  405. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  406. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  407. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  408. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  409. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  410. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  411. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  412. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  413. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  414. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  415. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  416. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  417. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  418. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  419. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  420. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  421. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  422. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  423. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  424. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  425. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  426. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  427. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  428. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  429. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  430. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  431. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  432. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  433. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  434. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  435. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  436. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  437. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  438. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  439. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  440. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  441. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  442. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  443. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  444. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  445. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  446. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  447. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  448. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  449. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  450. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  451. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  452. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  458. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  459. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  460. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  461. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  462. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  463. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  464. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  465. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  466. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  467. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  468. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  469. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  470. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  471. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  472. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  473. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  474. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  475. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  476. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  477. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  478. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  479. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  480. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  481. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
  482. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
  483. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
  484. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
@@ -1,184 +0,0 @@
1
- ---
2
- name: webapp-testing
3
- version: 2.0.0
4
- category: testing
5
- description: Automated webapp testing with Playwright. Server management, UI testing, visual debugging, and reconnaissance-first approach.
6
- license: Complete terms in LICENSE.txt
7
- progressive_disclosure:
8
- entry_point:
9
- summary: "Reconnaissance before action: verify server state and page load before testing"
10
- when_to_use: "When testing web applications with Playwright. Server verification, UI testing, frontend debugging."
11
- quick_start: "1. Check server with lsof 2. Start with with_server.py 3. Wait for networkidle 4. Screenshot and verify"
12
- references:
13
- - playwright-patterns.md
14
- - server-management.md
15
- - reconnaissance-pattern.md
16
- - decision-tree.md
17
- - troubleshooting.md
18
- ---
19
-
20
- # Webapp Testing
21
-
22
- ## Overview
23
-
24
- **Core Principle: Reconnaissance Before Action**
25
-
26
- Automated webapp testing using Playwright with a focus on verifying system state (server status, page load, element presence) before taking any action. This ensures reliable, debuggable tests that fail for clear reasons.
27
-
28
- **Key capabilities:**
29
- - Automated browser testing with Playwright
30
- - Server lifecycle management
31
- - Visual reconnaissance (screenshots, DOM inspection)
32
- - Network monitoring and debugging
33
-
34
- ## When to Use This Skill
35
-
36
- - **Web application testing** - UI behavior, forms, navigation, integration testing
37
- - **Frontend debugging** - Screenshots, DOM inspection, console monitoring
38
- - **Regression testing** - Ensure changes don't break existing functionality
39
- - **Server verification** - Check servers are running and responding
40
-
41
- **Not suitable for:** Unit testing (use Jest/pytest), load testing, or API-only testing.
42
-
43
- ## The Iron Law
44
-
45
- **RECONNAISSANCE BEFORE ACTION**
46
-
47
- Never execute test actions without first:
48
- 1. **Verify server state** - `lsof -i :PORT` and `curl` checks
49
- 2. **Wait for page ready** - `page.wait_for_load_state('networkidle')`
50
- 3. **Visual confirmation** - Screenshot before actions
51
- 4. **Read complete output** - Examine full results before claiming success
52
-
53
- **Why:** Tests fail mysteriously when servers aren't ready, selectors break when DOM is still building, and 5 seconds of reconnaissance saves 30 minutes of debugging.
54
-
55
- ## Quick Start
56
-
57
- ### Step 1: Verify Server State
58
-
59
- ```bash
60
- lsof -i :3000 -sTCP:LISTEN # Check server listening
61
- curl -f http://localhost:3000/health # Test response
62
- ```
63
-
64
- ### Step 2: Start Server (If Needed)
65
-
66
- ```bash
67
- # Single server
68
- python scripts/with_server.py --server "npm run dev" --port 5173 -- python test.py
69
-
70
- # Multiple servers (backend + frontend)
71
- python scripts/with_server.py \
72
- --server "cd backend && python server.py" --port 3000 \
73
- --server "cd frontend && npm run dev" --port 5173 \
74
- -- python test.py
75
- ```
76
-
77
- ### Step 3: Write Test with Reconnaissance
78
-
79
- ```python
80
- from playwright.sync_api import sync_playwright
81
-
82
- with sync_playwright() as p:
83
- browser = p.chromium.launch(headless=True)
84
- page = browser.new_page()
85
-
86
- # 1. Navigate and wait
87
- page.goto('http://localhost:5173')
88
- page.wait_for_load_state('networkidle') # CRITICAL
89
-
90
- # 2. Reconnaissance
91
- page.screenshot(path='/tmp/before.png', full_page=True)
92
- buttons = page.locator('button').all()
93
- print(f"Found {len(buttons)} buttons")
94
-
95
- # 3. Execute
96
- page.click('button.submit')
97
-
98
- # 4. Verify
99
- page.wait_for_selector('.success-message')
100
- page.screenshot(path='/tmp/after.png', full_page=True)
101
-
102
- browser.close()
103
- ```
104
-
105
- ### Step 4: Verify Results
106
-
107
- Review console output, check for errors, verify state changes, examine screenshots.
108
-
109
- ## Key Patterns
110
-
111
- **Server Management** - Check → Start → Wait → Test → Cleanup
112
- - Use `with_server.py` for automatic lifecycle management
113
- - Check status with `lsof`, test with `curl`
114
- - Automatic cleanup on exit
115
-
116
- **Reconnaissance** - Inspect → Understand → Act → Verify
117
- - Screenshot current state
118
- - Inspect DOM for elements
119
- - Act on discovered selectors
120
- - Verify results visually
121
-
122
- **Wait Strategy** - Load → Idle → Element → Action
123
- - Always wait for `networkidle` on dynamic apps
124
- - Wait for specific elements before interaction
125
- - Playwright auto-waits but explicit waits prevent race conditions
126
-
127
- **Selector Priority** - data-testid > role > text > CSS > XPath
128
- - `[data-testid="submit"]` - most stable
129
- - `role=button[name="Submit"]` - semantic
130
- - `text=Submit` - readable
131
- - `button.submit` - acceptable
132
- - XPath - last resort
133
-
134
- ## Common Pitfalls
135
-
136
- ❌ **Testing without server verification** - Always check `lsof` and `curl` first
137
- ❌ **Ignoring timeout errors** - TimeoutError means something is wrong, investigate
138
- ❌ **Not waiting for networkidle** - Dynamic apps need full page load
139
- ❌ **Poor selector strategies** - Use data-testid for stability
140
- ❌ **Missing network verification** - Check API responses complete
141
- ❌ **Incomplete cleanup** - Close browsers, stop servers properly
142
-
143
- ## Reference Documentation
144
-
145
- **[playwright-patterns.md](playwright-patterns.md)** - Complete Playwright reference
146
- Selectors, waits, interactions, assertions, test organization, network interception, screenshots, debugging
147
-
148
- **[server-management.md](server-management.md)** - Server lifecycle and operations
149
- with_server.py usage, manual management, port management, process control, environment config, health checks
150
-
151
- **[reconnaissance-pattern.md](reconnaissance-pattern.md)** - Philosophy and practice
152
- Why reconnaissance first, complete process, server checks, network diagnostics, DOM inspection, log analysis
153
-
154
- **[decision-tree.md](decision-tree.md)** - Flowcharts for every scenario
155
- New test decisions, server state paths, test failure diagnosis, debugging flows, selector/wait strategies
156
-
157
- **[troubleshooting.md](troubleshooting.md)** - Solutions to common problems
158
- Timeout issues, selector problems, server crashes, network errors, environment config, debugging workflow
159
-
160
- ## Examples and Scripts
161
-
162
- **Examples** (`examples/` directory):
163
- - `element_discovery.py` - Discovering page elements
164
- - `static_html_automation.py` - Testing local HTML files
165
- - `console_logging.py` - Capturing console output
166
-
167
- **Scripts** (`scripts/` directory):
168
- - `with_server.py` - Server lifecycle management (run with `--help` first)
169
-
170
- ## Integration with Other Skills
171
-
172
- **Mandatory:** verification-before-completion
173
- **Recommended:** systematic-debugging, test-driven-development
174
- **Related:** playwright-testing, selenium-automation
175
-
176
- ## Bottom Line
177
-
178
- 1. **Reconnaissance always comes first** - Verify before acting
179
- 2. **Never skip server checks** - 5 seconds saves 30 minutes
180
- 3. **Wait for networkidle** - Dynamic apps need time
181
- 4. **Read complete output** - Verify before claiming success
182
- 5. **Screenshot everything** - Visual evidence is invaluable
183
-
184
- The reconnaissance-then-action pattern is not optional - it's the foundation of reliable webapp testing.
@@ -1,459 +0,0 @@
1
- # Decision Tree Reference
2
-
3
- Complete flowcharts and decision guides for webapp testing scenarios.
4
-
5
- ## Table of Contents
6
-
7
- - [Start Here: New Test Decision Tree](#start-here-new-test-decision-tree)
8
- - [Server State Decision Tree](#server-state-decision-tree)
9
- - [Test Failure Decision Tree](#test-failure-decision-tree)
10
- - [Debugging Decision Tree](#debugging-decision-tree)
11
- - [Selector Strategy Decision Tree](#selector-strategy-decision-tree)
12
- - [Wait Strategy Decision Tree](#wait-strategy-decision-tree)
13
- - [Environment Selection Decision Tree](#environment-selection-decision-tree)
14
- - [Testing Approach Decision Tree](#testing-approach-decision-tree)
15
-
16
- ## Start Here: New Test Decision Tree
17
-
18
- ```
19
- User requests webapp testing
20
-
21
- Is it a local webapp?
22
- ├─ No → Ask for deployment URL
23
- │ ├─ Public URL → Test directly with Playwright
24
- │ └─ Private URL → Configure authentication first
25
-
26
- └─ Yes → What type of webapp?
27
- ├─ Static HTML file
28
- │ ├─ Read HTML source directly
29
- │ │ ├─ Can identify selectors? → Write test
30
- │ │ └─ Need to see rendered? → Use file:// URL
31
- │ └─ Write Playwright script with file:// URL
32
-
33
- ├─ Dynamic webapp (React, Vue, Angular, etc.)
34
- │ └─ Is server already running?
35
- │ ├─ Yes → Check server status
36
- │ │ ├─ lsof -i :PORT shows LISTEN
37
- │ │ │ └─ curl http://localhost:PORT succeeds
38
- │ │ │ └─ Write Playwright test
39
- │ │ └─ Server not responding
40
- │ │ └─ Restart server
41
- │ │
42
- │ └─ No → Need to start server
43
- │ ├─ Single server
44
- │ │ └─ Use with_server.py:
45
- │ │ python scripts/with_server.py \
46
- │ │ --server "npm start" --port 3000 \
47
- │ │ -- python test.py
48
- │ │
49
- │ └─ Multiple servers (backend + frontend)
50
- │ └─ Use with_server.py with multiple --server flags:
51
- │ python scripts/with_server.py \
52
- │ --server "cd backend && npm start" --port 4000 \
53
- │ --server "cd frontend && npm start" --port 3000 \
54
- │ -- python test.py
55
-
56
- └─ Server-side rendered (Django, Flask, Rails, etc.)
57
- └─ Follow dynamic webapp path above
58
- ```
59
-
60
- ## Server State Decision Tree
61
-
62
- ```
63
- Need to test webapp
64
-
65
- Check if server is running
66
- └─ lsof -i :PORT -sTCP:LISTEN
67
- ├─ No output (server not running)
68
- │ └─ Need to start server
69
- │ ├─ Know server command?
70
- │ │ ├─ Yes → Use with_server.py
71
- │ │ └─ No → Check package.json or README
72
- │ │ ├─ Found start command
73
- │ │ │ └─ Use with_server.py
74
- │ │ └─ Can't find command
75
- │ │ └─ Ask user for startup instructions
76
- │ │
77
- │ └─ Port conflict?
78
- │ ├─ Check: lsof -i :PORT (without LISTEN filter)
79
- │ │ └─ Shows process using port
80
- │ │ ├─ Different app using port
81
- │ │ │ └─ Kill: lsof -t -i :PORT | xargs kill
82
- │ │ └─ Old instance of same app
83
- │ │ └─ Kill and restart
84
- │ └─ Port available
85
- │ └─ Start server on this port
86
-
87
- └─ Shows server (server running)
88
- └─ Test HTTP response
89
- └─ curl -f http://localhost:PORT/health
90
- ├─ Success (200 OK)
91
- │ └─ Server is healthy
92
- │ └─ Proceed with testing
93
-
94
- ├─ Connection refused
95
- │ └─ Process running but not accepting connections
96
- │ ├─ Check logs: tail -f server.log
97
- │ ├─ Check if still starting up
98
- │ │ └─ Wait 10-30 seconds and retry
99
- │ └─ Server may have crashed during startup
100
- │ └─ Restart server
101
-
102
- ├─ Timeout
103
- │ └─ Server responding slowly
104
- │ ├─ Check server resource usage
105
- │ │ └─ ps -p PID -o %cpu,%mem
106
- │ ├─ High CPU/memory?
107
- │ │ └─ Server may be overloaded
108
- │ └─ Increase timeout or wait longer
109
-
110
- └─ 404 or other error
111
- └─ Server running but endpoint doesn't exist
112
- ├─ Try root: curl http://localhost:PORT/
113
- └─ Check server routes/endpoints
114
- ```
115
-
116
- ## Test Failure Decision Tree
117
-
118
- ```
119
- Playwright test failed
120
-
121
- What type of error?
122
- ├─ TimeoutError: Timeout 30000ms exceeded
123
- │ └─ What was timing out?
124
- │ ├─ page.goto() timeout
125
- │ │ └─ Server issues
126
- │ │ ├─ Check server is running
127
- │ │ ├─ Check server response time: curl -w "Time: %{time_total}s\n"
128
- │ │ ├─ Increase timeout: goto(url, timeout=60000)
129
- │ │ └─ Check network connectivity
130
- │ │
131
- │ ├─ wait_for_selector() timeout
132
- │ │ └─ Element not appearing
133
- │ │ ├─ Did you wait for networkidle first?
134
- │ │ │ └─ No → Add page.wait_for_load_state('networkidle')
135
- │ │ ├─ Take screenshot to see actual state
136
- │ │ │ └─ page.screenshot(path='/tmp/debug.png', full_page=True)
137
- │ │ ├─ Is selector correct?
138
- │ │ │ └─ Inspect DOM: page.content()
139
- │ │ └─ Is element conditionally rendered?
140
- │ │ └─ Check application state
141
- │ │
142
- │ ├─ page.click() timeout
143
- │ │ └─ Element not clickable
144
- │ │ ├─ Element not visible?
145
- │ │ │ └─ Check: page.locator(selector).is_visible()
146
- │ │ ├─ Element disabled?
147
- │ │ │ └─ Check: page.locator(selector).is_enabled()
148
- │ │ ├─ Element obscured by another element?
149
- │ │ │ └─ Try: page.click(selector, force=True)
150
- │ │ └─ Selector matches multiple elements?
151
- │ │ └─ Make selector more specific
152
- │ │
153
- │ └─ wait_for_load_state() timeout
154
- │ └─ Page never reaches networkidle
155
- │ ├─ Polling API?
156
- │ │ └─ Use 'load' instead of 'networkidle'
157
- │ ├─ WebSocket connection?
158
- │ │ └─ Use 'load' instead of 'networkidle'
159
- │ └─ Long-running requests?
160
- │ └─ Wait for specific element instead
161
-
162
- ├─ Error: Element not found
163
- │ └─ Selector doesn't match
164
- │ ├─ Wrong selector syntax?
165
- │ │ ├─ text= for text content
166
- │ │ ├─ role= for ARIA roles
167
- │ │ ├─ CSS selector for classes/IDs
168
- │ │ └─ xpath= for XPath
169
- │ ├─ Element doesn't exist?
170
- │ │ └─ Inspect DOM: page.content()
171
- │ ├─ Element inside iframe?
172
- │ │ └─ Use: page.frame_locator('iframe').locator(selector)
173
- │ └─ Element created dynamically?
174
- │ └─ Wait for element first: page.wait_for_selector(selector)
175
-
176
- ├─ Error: Element is not visible
177
- │ └─ Element exists but not visible
178
- │ ├─ Display: none or visibility: hidden?
179
- │ │ └─ Check CSS properties
180
- │ ├─ Outside viewport?
181
- │ │ └─ Scroll to element: page.locator(selector).scroll_into_view_if_needed()
182
- │ ├─ Hidden by parent?
183
- │ │ └─ Check parent visibility
184
- │ └─ Animation in progress?
185
- │ └─ Wait for animation: page.wait_for_timeout(500)
186
-
187
- ├─ Error: Element is not enabled
188
- │ └─ Button/input disabled
189
- │ ├─ Check application state
190
- │ │ └─ What conditions enable this element?
191
- │ ├─ Need to fill other fields first?
192
- │ │ └─ Complete prerequisite steps
193
- │ └─ Network request must complete first?
194
- │ └─ Wait for API response
195
-
196
- ├─ Error: Connection refused / ECONNREFUSED
197
- │ └─ Server not accessible
198
- │ └─ Follow Server State Decision Tree above
199
-
200
- ├─ JavaScript error in console
201
- │ └─ Application error
202
- │ ├─ Capture console logs
203
- │ │ └─ page.on("console", lambda msg: print(msg.text))
204
- │ ├─ Check browser console in headed mode
205
- │ │ └─ launch(headless=False)
206
- │ └─ Review application code
207
-
208
- └─ Test assertion failed
209
- └─ Unexpected state
210
- ├─ Take screenshot: page.screenshot(path='/tmp/actual.png')
211
- ├─ Compare with expected state
212
- ├─ Check console for errors
213
- └─ Review test logic
214
- ```
215
-
216
- ## Debugging Decision Tree
217
-
218
- ```
219
- Test is failing, need to debug
220
-
221
- Start with reconnaissance
222
- ├─ Server reconnaissance
223
- │ ├─ lsof -i :PORT -sTCP:LISTEN
224
- │ ├─ curl http://localhost:PORT/health
225
- │ └─ tail -f server.log
226
-
227
- ├─ Visual reconnaissance
228
- │ ├─ page.screenshot(path='/tmp/debug.png', full_page=True)
229
- │ └─ Open screenshot to see actual state
230
-
231
- ├─ DOM reconnaissance
232
- │ ├─ content = page.content()
233
- │ ├─ print(content[:500])
234
- │ └─ Search for expected elements
235
-
236
- └─ Console reconnaissance
237
- ├─ page.on("console", handler)
238
- └─ Check for JavaScript errors
239
-
240
- Analyze reconnaissance data
241
- ├─ Server not running?
242
- │ └─ Follow Server State Decision Tree
243
-
244
- ├─ Page not loaded correctly?
245
- │ ├─ Screenshot shows blank page
246
- │ │ ├─ Network issue?
247
- │ │ ├─ Server returned error?
248
- │ │ └─ Wrong URL?
249
- │ ├─ Screenshot shows loading spinner
250
- │ │ ├─ Wait longer: wait_for_load_state('networkidle')
251
- │ │ └─ Check for blocking requests
252
- │ └─ Screenshot shows error page
253
- │ └─ Check server logs for errors
254
-
255
- ├─ Element not found?
256
- │ ├─ Search DOM content for element
257
- │ │ ├─ Not in DOM → Wait longer or check conditions
258
- │ │ └─ In DOM → Selector is wrong
259
- │ └─ Highlight element to verify
260
- │ └─ page.locator(selector).evaluate('el => el.style.border = "3px solid red"')
261
-
262
- ├─ Console errors?
263
- │ ├─ JavaScript syntax error
264
- │ │ └─ Application bug
265
- │ ├─ Network request failed
266
- │ │ └─ API server issue
267
- │ └─ React/Vue error
268
- │ └─ Component issue
269
-
270
- └─ Still unclear?
271
- └─ Progressive debugging
272
- ├─ Run in headed mode: launch(headless=False)
273
- ├─ Add slow motion: launch(slow_mo=1000)
274
- ├─ Add pause: page.pause()
275
- └─ Enable verbose logging: DEBUG=pw:api python test.py
276
- ```
277
-
278
- ## Selector Strategy Decision Tree
279
-
280
- ```
281
- Need to select an element
282
-
283
- What do you know about the element?
284
- ├─ Has data-testid attribute?
285
- │ └─ USE: page.click('[data-testid="submit"]')
286
- │ → Most stable, won't break with UI changes
287
-
288
- ├─ Has unique text content?
289
- │ └─ USE: page.click('text=Submit Form')
290
- │ → Readable, but text may change
291
- │ ├─ Exact match: 'text="Submit"'
292
- │ └─ Regex: 'text=/submit/i'
293
-
294
- ├─ Has semantic role?
295
- │ └─ USE: page.click('role=button[name="Submit"]')
296
- │ → Accessible, semantic, stable
297
- │ ├─ Common roles: button, link, textbox, checkbox
298
- │ └─ With name: role=button[name="Submit"]
299
-
300
- ├─ Has unique ID?
301
- │ └─ USE: page.click('#submit-button')
302
- │ → Fast, stable if ID doesn't change
303
- │ └─ Avoid dynamically generated IDs
304
-
305
- ├─ Has unique class?
306
- │ └─ USE: page.click('.submit-button')
307
- │ → May break with CSS refactoring
308
- │ └─ Combine with tag: 'button.submit'
309
-
310
- ├─ Need complex selection?
311
- │ └─ USE: CSS combinators
312
- │ ├─ Child: 'form > button'
313
- │ ├─ Descendant: 'form button'
314
- │ ├─ Sibling: '.label + input'
315
- │ └─ Nth child: 'button:nth-child(2)'
316
-
317
- ├─ Nothing else works?
318
- │ └─ USE: XPath (last resort)
319
- │ └─ 'xpath=//button[contains(text(), "Submit")]'
320
-
321
- └─ Multiple matches?
322
- └─ Make selector more specific
323
- ├─ Chain: page.locator('form').locator('button.submit')
324
- ├─ Combine: 'button.submit[type="submit"]'
325
- └─ Use parent context: 'div.modal >> button.submit'
326
- ```
327
-
328
- ## Wait Strategy Decision Tree
329
-
330
- ```
331
- Need to wait for something
332
-
333
- What are you waiting for?
334
- ├─ Page to load
335
- │ └─ What type of page?
336
- │ ├─ Dynamic (React, Vue, Angular)
337
- │ │ └─ USE: page.wait_for_load_state('networkidle')
338
- │ │ → Waits for network requests to finish
339
- │ ├─ Static with images
340
- │ │ └─ USE: page.wait_for_load_state('load')
341
- │ │ → Waits for all resources
342
- │ └─ Server-side rendered
343
- │ └─ USE: page.wait_for_load_state('domcontentloaded')
344
- │ → Waits for HTML to parse
345
-
346
- ├─ Specific element
347
- │ └─ What state?
348
- │ ├─ Element to appear
349
- │ │ └─ USE: page.wait_for_selector('.modal', state='visible')
350
- │ ├─ Element to disappear
351
- │ │ └─ USE: page.wait_for_selector('.loading', state='hidden')
352
- │ ├─ Element to exist in DOM
353
- │ │ └─ USE: page.wait_for_selector('.data', state='attached')
354
- │ └─ Element to be removed from DOM
355
- │ └─ USE: page.wait_for_selector('.temp', state='detached')
356
-
357
- ├─ Network request
358
- │ └─ Specific API call
359
- │ ├─ Wait for response
360
- │ │ └─ USE: with page.expect_response('**/api/data'):
361
- │ ├─ Wait for request
362
- │ │ └─ USE: with page.expect_request('**/api/data'):
363
- │ └─ All network idle
364
- │ └─ USE: page.wait_for_load_state('networkidle')
365
-
366
- ├─ JavaScript condition
367
- │ └─ Custom condition
368
- │ ├─ Variable set
369
- │ │ └─ USE: page.wait_for_function('() => window.appReady')
370
- │ ├─ Element content
371
- │ │ └─ USE: page.wait_for_function('() => document.body.innerText.includes("Ready")')
372
- │ └─ Animation complete
373
- │ └─ USE: page.wait_for_function('() => !document.querySelector(".animated")')
374
-
375
- ├─ Fixed time (avoid if possible)
376
- │ └─ Known delay
377
- │ └─ USE: page.wait_for_timeout(1000)
378
- │ → Only use when no other option works
379
-
380
- └─ Multiple conditions
381
- └─ Combine waits
382
- ├─ Sequential: wait_for_selector() then wait_for_function()
383
- └─ Parallel: Use Promise.all() in async context
384
- ```
385
-
386
- ## Environment Selection Decision Tree
387
-
388
- ```
389
- Setting up test environment
390
-
391
- What environment do you need?
392
- ├─ Local development
393
- │ ├─ Testing during development
394
- │ │ ├─ Server: npm run dev (hot reload)
395
- │ │ ├─ Port: 3000 (dev port)
396
- │ │ └─ Database: Local SQLite/Postgres
397
- │ └─ Quick iteration cycle
398
-
399
- ├─ CI/CD pipeline
400
- │ ├─ Automated testing
401
- │ │ ├─ Server: npm run build && npm start
402
- │ │ ├─ Port: Any available port
403
- │ │ ├─ Database: Test database / fixtures
404
- │ │ └─ Headless: Always true
405
- │ └─ Environment variables from CI secrets
406
-
407
- ├─ Staging
408
- │ ├─ Pre-production testing
409
- │ │ ├─ Server: Remote staging URL
410
- │ │ ├─ Database: Staging database
411
- │ │ └─ Real API keys (staging)
412
- │ └─ Similar to production
413
-
414
- └─ Production (careful!)
415
- ├─ Read-only tests only
416
- ├─ No data modification
417
- └─ Minimal load generation
418
- ```
419
-
420
- ## Testing Approach Decision Tree
421
-
422
- ```
423
- What kind of test do you need?
424
-
425
- ├─ Unit test (single function/component)
426
- │ └─ NOT this skill
427
- │ → Use testing framework (Jest, pytest)
428
-
429
- ├─ Integration test (multiple components)
430
- │ └─ Do components interact via UI?
431
- │ ├─ Yes → Use this skill (Playwright)
432
- │ └─ No → Use API testing or unit tests
433
-
434
- ├─ End-to-end test (full user flow)
435
- │ └─ USE THIS SKILL
436
- │ ├─ Start server(s) with with_server.py
437
- │ ├─ Write Playwright script for user journey
438
- │ └─ Test complete workflow
439
-
440
- ├─ Visual regression test
441
- │ └─ USE THIS SKILL + Screenshot comparison
442
- │ ├─ Capture baseline: page.screenshot()
443
- │ ├─ Capture current: page.screenshot()
444
- │ └─ Compare images (external tool)
445
-
446
- ├─ Performance test
447
- │ └─ What metrics?
448
- │ ├─ Page load time
449
- │ │ └─ Measure: page.goto() timing
450
- │ ├─ API response time
451
- │ │ └─ Monitor: page.on("response")
452
- │ └─ Heavy load
453
- │ → Not this skill, use load testing tool
454
-
455
- └─ Accessibility test
456
- └─ USE THIS SKILL + axe-core
457
- ├─ Inject axe: page.evaluate()
458
- └─ Run audit: Check ARIA, contrast, etc.
459
- ```