claude-mpm 4.21.3__py3-none-any.whl → 5.1.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 (517) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
  4. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +1239 -674
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  7. claude_mpm/agents/__init__.py +6 -0
  8. claude_mpm/agents/agent_loader.py +1 -4
  9. claude_mpm/agents/base_agent.json +6 -3
  10. claude_mpm/agents/base_agent_loader.py +10 -35
  11. claude_mpm/agents/frontmatter_validator.py +69 -1
  12. claude_mpm/agents/templates/circuit-breakers.md +1254 -0
  13. claude_mpm/agents/templates/context-management-examples.md +544 -0
  14. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  15. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  16. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  17. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  18. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  19. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  20. claude_mpm/cli/__init__.py +37 -2
  21. claude_mpm/cli/commands/__init__.py +2 -0
  22. claude_mpm/cli/commands/agent_source.py +774 -0
  23. claude_mpm/cli/commands/agent_state_manager.py +188 -30
  24. claude_mpm/cli/commands/agents.py +1128 -36
  25. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  26. claude_mpm/cli/commands/agents_discover.py +338 -0
  27. claude_mpm/cli/commands/aggregate.py +1 -1
  28. claude_mpm/cli/commands/analyze.py +3 -3
  29. claude_mpm/cli/commands/auto_configure.py +537 -239
  30. claude_mpm/cli/commands/cleanup.py +1 -1
  31. claude_mpm/cli/commands/config.py +7 -4
  32. claude_mpm/cli/commands/configure.py +935 -45
  33. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  34. claude_mpm/cli/commands/configure_navigation.py +63 -46
  35. claude_mpm/cli/commands/debug.py +12 -12
  36. claude_mpm/cli/commands/doctor.py +10 -2
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/local_deploy.py +1 -4
  39. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  40. claude_mpm/cli/commands/mpm_init/core.py +50 -2
  41. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  42. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  43. claude_mpm/cli/commands/postmortem.py +401 -0
  44. claude_mpm/cli/commands/run.py +125 -167
  45. claude_mpm/cli/commands/skill_source.py +694 -0
  46. claude_mpm/cli/commands/skills.py +757 -20
  47. claude_mpm/cli/executor.py +78 -3
  48. claude_mpm/cli/interactive/agent_wizard.py +1032 -47
  49. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  50. claude_mpm/cli/parsers/agents_parser.py +310 -4
  51. claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
  52. claude_mpm/cli/parsers/base_parser.py +53 -0
  53. claude_mpm/cli/parsers/config_parser.py +96 -43
  54. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  55. claude_mpm/cli/parsers/skills_parser.py +145 -0
  56. claude_mpm/cli/parsers/source_parser.py +138 -0
  57. claude_mpm/cli/startup.py +564 -108
  58. claude_mpm/cli/startup_display.py +480 -0
  59. claude_mpm/cli/utils.py +1 -1
  60. claude_mpm/cli_module/commands.py +1 -1
  61. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  62. claude_mpm/commands/mpm-agents-detect.md +9 -0
  63. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  64. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  65. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  66. claude_mpm/commands/mpm-doctor.md +9 -0
  67. claude_mpm/commands/mpm-help.md +14 -2
  68. claude_mpm/commands/mpm-init.md +27 -2
  69. claude_mpm/commands/mpm-monitor.md +9 -0
  70. claude_mpm/commands/mpm-postmortem.md +123 -0
  71. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  72. claude_mpm/commands/mpm-status.md +9 -0
  73. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  74. claude_mpm/commands/mpm-ticket-view.md +552 -0
  75. claude_mpm/commands/mpm-version.md +9 -0
  76. claude_mpm/commands/mpm.md +10 -0
  77. claude_mpm/config/agent_presets.py +488 -0
  78. claude_mpm/config/agent_sources.py +325 -0
  79. claude_mpm/config/skill_presets.py +392 -0
  80. claude_mpm/config/skill_sources.py +590 -0
  81. claude_mpm/constants.py +13 -0
  82. claude_mpm/core/api_validator.py +1 -1
  83. claude_mpm/core/claude_runner.py +19 -35
  84. claude_mpm/core/config.py +24 -0
  85. claude_mpm/core/constants.py +1 -1
  86. claude_mpm/core/framework/__init__.py +3 -16
  87. claude_mpm/core/framework/loaders/file_loader.py +54 -101
  88. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  89. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  90. claude_mpm/core/hook_error_memory.py +381 -0
  91. claude_mpm/core/hook_manager.py +41 -2
  92. claude_mpm/core/interactive_session.py +131 -10
  93. claude_mpm/core/logger.py +3 -1
  94. claude_mpm/core/oneshot_session.py +110 -8
  95. claude_mpm/core/output_style_manager.py +173 -43
  96. claude_mpm/core/protocols/__init__.py +23 -0
  97. claude_mpm/core/protocols/runner_protocol.py +103 -0
  98. claude_mpm/core/protocols/session_protocol.py +131 -0
  99. claude_mpm/core/shared/singleton_manager.py +11 -4
  100. claude_mpm/core/system_context.py +38 -0
  101. claude_mpm/core/unified_agent_registry.py +129 -1
  102. claude_mpm/core/unified_config.py +22 -0
  103. claude_mpm/dashboard/static/css/activity.css +69 -69
  104. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  105. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  106. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  107. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  108. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  109. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  110. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  111. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  112. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  113. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  114. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  115. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  116. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  117. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  118. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  119. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  120. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  121. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  122. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  123. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  124. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  125. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  126. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  127. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  128. claude_mpm/dashboard/templates/code_simple.html +23 -23
  129. claude_mpm/dashboard/templates/index.html +18 -18
  130. claude_mpm/experimental/cli_enhancements.py +1 -5
  131. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  132. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  133. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  134. claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
  135. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  136. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  137. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  138. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  139. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  140. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  141. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  142. claude_mpm/models/agent_definition.py +7 -0
  143. claude_mpm/models/git_repository.py +198 -0
  144. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  145. claude_mpm/scripts/start_activity_logging.py +3 -1
  146. claude_mpm/services/agents/agent_builder.py +45 -9
  147. claude_mpm/services/agents/agent_preset_service.py +238 -0
  148. claude_mpm/services/agents/agent_selection_service.py +484 -0
  149. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  150. claude_mpm/services/agents/cache_git_manager.py +621 -0
  151. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  152. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  153. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  154. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  155. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  156. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  157. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  158. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  159. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  160. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  161. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +225 -18
  162. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  163. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  164. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +557 -0
  165. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  166. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  167. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  168. claude_mpm/services/agents/git_source_manager.py +629 -0
  169. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  170. claude_mpm/services/agents/local_template_manager.py +50 -10
  171. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  172. claude_mpm/services/agents/sources/__init__.py +13 -0
  173. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  174. claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
  175. claude_mpm/services/agents/startup_sync.py +239 -0
  176. claude_mpm/services/agents/toolchain_detector.py +474 -0
  177. claude_mpm/services/analysis/__init__.py +25 -0
  178. claude_mpm/services/analysis/postmortem_reporter.py +474 -0
  179. claude_mpm/services/analysis/postmortem_service.py +765 -0
  180. claude_mpm/services/cli/session_pause_manager.py +1 -1
  181. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  182. claude_mpm/services/command_deployment_service.py +200 -6
  183. claude_mpm/services/core/base.py +7 -2
  184. claude_mpm/services/core/interfaces/__init__.py +1 -3
  185. claude_mpm/services/core/interfaces/health.py +1 -4
  186. claude_mpm/services/core/models/__init__.py +2 -11
  187. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  188. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  189. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  190. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  191. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  192. claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
  193. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  194. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  195. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  196. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  197. claude_mpm/services/event_bus/direct_relay.py +3 -3
  198. claude_mpm/services/event_bus/event_bus.py +36 -3
  199. claude_mpm/services/events/consumers/logging.py +1 -2
  200. claude_mpm/services/git/__init__.py +21 -0
  201. claude_mpm/services/git/git_operations_service.py +494 -0
  202. claude_mpm/services/github/__init__.py +21 -0
  203. claude_mpm/services/github/github_cli_service.py +397 -0
  204. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  205. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  206. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  207. claude_mpm/services/instructions/__init__.py +9 -0
  208. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  209. claude_mpm/services/local_ops/__init__.py +3 -13
  210. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  211. claude_mpm/services/local_ops/health_manager.py +1 -4
  212. claude_mpm/services/local_ops/process_manager.py +1 -1
  213. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  214. claude_mpm/services/mcp_config_manager.py +75 -145
  215. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  216. claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
  217. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  218. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  219. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  220. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  221. claude_mpm/services/mcp_service_verifier.py +6 -3
  222. claude_mpm/services/memory/optimizer.py +1 -1
  223. claude_mpm/services/model/model_router.py +8 -9
  224. claude_mpm/services/monitor/daemon.py +29 -9
  225. claude_mpm/services/monitor/daemon_manager.py +96 -19
  226. claude_mpm/services/monitor/server.py +2 -2
  227. claude_mpm/services/native_agent_converter.py +356 -0
  228. claude_mpm/services/port_manager.py +1 -1
  229. claude_mpm/services/pr/__init__.py +14 -0
  230. claude_mpm/services/pr/pr_template_service.py +329 -0
  231. claude_mpm/services/project/documentation_manager.py +2 -1
  232. claude_mpm/services/project/project_organizer.py +4 -0
  233. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  234. claude_mpm/services/runner_configuration_service.py +17 -3
  235. claude_mpm/services/self_upgrade_service.py +165 -7
  236. claude_mpm/services/session_management_service.py +16 -4
  237. claude_mpm/services/skills/__init__.py +18 -0
  238. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  239. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  240. claude_mpm/services/skills_config.py +547 -0
  241. claude_mpm/services/skills_deployer.py +955 -0
  242. claude_mpm/services/socketio/handlers/connection.py +1 -1
  243. claude_mpm/services/socketio/handlers/git.py +2 -2
  244. claude_mpm/services/socketio/server/core.py +1 -4
  245. claude_mpm/services/socketio/server/main.py +1 -3
  246. claude_mpm/services/system_instructions_service.py +1 -3
  247. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  248. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  249. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  250. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  251. claude_mpm/services/unified/unified_deployment.py +1 -5
  252. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  253. claude_mpm/services/visualization/__init__.py +1 -5
  254. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  255. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  256. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  257. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  258. claude_mpm/skills/skills_registry.py +0 -1
  259. claude_mpm/templates/questions/__init__.py +38 -0
  260. claude_mpm/templates/questions/base.py +193 -0
  261. claude_mpm/templates/questions/pr_strategy.py +311 -0
  262. claude_mpm/templates/questions/project_init.py +385 -0
  263. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  264. claude_mpm/tools/__main__.py +8 -8
  265. claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
  266. claude_mpm/utils/agent_dependency_loader.py +80 -13
  267. claude_mpm/utils/agent_filters.py +288 -0
  268. claude_mpm/utils/dependency_cache.py +3 -1
  269. claude_mpm/utils/gitignore.py +244 -0
  270. claude_mpm/utils/log_cleanup.py +3 -3
  271. claude_mpm/utils/migration.py +372 -0
  272. claude_mpm/utils/progress.py +387 -0
  273. claude_mpm/utils/robust_installer.py +3 -5
  274. claude_mpm/utils/structured_questions.py +619 -0
  275. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/METADATA +496 -65
  276. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/RECORD +284 -443
  277. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  278. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  279. claude_mpm/agents/templates/agent-manager.json +0 -273
  280. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  281. claude_mpm/agents/templates/api_qa.json +0 -180
  282. claude_mpm/agents/templates/circuit_breakers.md +0 -638
  283. claude_mpm/agents/templates/clerk-ops.json +0 -235
  284. claude_mpm/agents/templates/code_analyzer.json +0 -101
  285. claude_mpm/agents/templates/content-agent.json +0 -358
  286. claude_mpm/agents/templates/dart_engineer.json +0 -307
  287. claude_mpm/agents/templates/data_engineer.json +0 -225
  288. claude_mpm/agents/templates/documentation.json +0 -211
  289. claude_mpm/agents/templates/engineer.json +0 -210
  290. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  291. claude_mpm/agents/templates/golang_engineer.json +0 -270
  292. claude_mpm/agents/templates/imagemagick.json +0 -264
  293. claude_mpm/agents/templates/java_engineer.json +0 -346
  294. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  295. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  296. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  297. claude_mpm/agents/templates/memory_manager.json +0 -158
  298. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  299. claude_mpm/agents/templates/ops.json +0 -185
  300. claude_mpm/agents/templates/php-engineer.json +0 -287
  301. claude_mpm/agents/templates/product_owner.json +0 -338
  302. claude_mpm/agents/templates/project_organizer.json +0 -140
  303. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  304. claude_mpm/agents/templates/python_engineer.json +0 -387
  305. claude_mpm/agents/templates/qa.json +0 -242
  306. claude_mpm/agents/templates/react_engineer.json +0 -238
  307. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  308. claude_mpm/agents/templates/research.json +0 -188
  309. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  310. claude_mpm/agents/templates/rust_engineer.json +0 -275
  311. claude_mpm/agents/templates/security.json +0 -202
  312. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  313. claude_mpm/agents/templates/ticketing.json +0 -177
  314. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  315. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  316. claude_mpm/agents/templates/version_control.json +0 -157
  317. claude_mpm/agents/templates/web_qa.json +0 -399
  318. claude_mpm/agents/templates/web_ui.json +0 -189
  319. claude_mpm/commands/mpm-tickets.md +0 -102
  320. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  321. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  322. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  323. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  324. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  325. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  326. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  327. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  328. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  329. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  330. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  331. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  332. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  333. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  334. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  335. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  336. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  337. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  338. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  339. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  340. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  341. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  342. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  343. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  344. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  345. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  346. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  347. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  348. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  349. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  350. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  351. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  352. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  353. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  354. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  355. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  356. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  357. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  358. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  359. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  360. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  361. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  362. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  363. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  364. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  365. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  366. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  367. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  368. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  369. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  370. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  371. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  372. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  373. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  374. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  375. claude_mpm/dashboard/static/built/react/events.js +0 -30
  376. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  377. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  378. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  379. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  380. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  381. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  382. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  383. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  384. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  385. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  386. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  387. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  388. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  389. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  390. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  391. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  392. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  393. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  394. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  395. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  396. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  397. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  398. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  399. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  400. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  401. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  402. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  403. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  404. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  405. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  406. claude_mpm/dashboard/static/events.html +0 -607
  407. claude_mpm/dashboard/static/index.html +0 -635
  408. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  409. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  410. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  411. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  412. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  413. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  414. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  415. claude_mpm/dashboard/static/legacy/files.html +0 -747
  416. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  417. claude_mpm/dashboard/static/monitors.html +0 -431
  418. claude_mpm/dashboard/static/production/events.html +0 -659
  419. claude_mpm/dashboard/static/production/main.html +0 -698
  420. claude_mpm/dashboard/static/production/monitors.html +0 -483
  421. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  422. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  423. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  424. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  425. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  426. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  427. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  428. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  429. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  430. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  431. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  432. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  433. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  434. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  435. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  436. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  437. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  438. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  439. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  440. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  441. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  442. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  443. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  444. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  445. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  446. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  447. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  448. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  449. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  450. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  451. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  452. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  453. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  454. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  455. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  456. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  457. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  458. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  459. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  460. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  461. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  462. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  463. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  464. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  465. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  466. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  467. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  468. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  469. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  470. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  471. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  472. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  473. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  474. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  475. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  476. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  477. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  478. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  479. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  480. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  481. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  482. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  483. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  484. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  485. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  486. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  487. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  488. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  489. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  490. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  491. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  492. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  493. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  494. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  495. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  496. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  497. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  498. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  499. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  500. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  501. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  502. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  503. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  504. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  505. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  506. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  507. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  508. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  509. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  510. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  511. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  512. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  513. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  514. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/WHEEL +0 -0
  515. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/entry_points.txt +0 -0
  516. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.dist-info}/licenses/LICENSE +0 -0
  517. {claude_mpm-4.21.3.dist-info → claude_mpm-5.1.9.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
- ```