claude-mpm 4.20.3__py3-none-any.whl → 4.25.10__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 (454) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +23 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1783 -34
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/base_agent.json +6 -3
  7. claude_mpm/agents/frontmatter_validator.py +1 -1
  8. claude_mpm/agents/templates/api_qa.json +5 -2
  9. claude_mpm/agents/templates/circuit_breakers.md +108 -2
  10. claude_mpm/agents/templates/documentation.json +33 -6
  11. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  12. claude_mpm/agents/templates/php-engineer.json +10 -4
  13. claude_mpm/agents/templates/pm_red_flags.md +89 -19
  14. claude_mpm/agents/templates/project_organizer.json +7 -3
  15. claude_mpm/agents/templates/qa.json +2 -1
  16. claude_mpm/agents/templates/react_engineer.json +1 -0
  17. claude_mpm/agents/templates/research.json +82 -12
  18. claude_mpm/agents/templates/security.json +4 -4
  19. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  20. claude_mpm/agents/templates/ticketing.json +10 -6
  21. claude_mpm/agents/templates/version_control.json +4 -2
  22. claude_mpm/agents/templates/web_qa.json +2 -1
  23. claude_mpm/cli/README.md +253 -0
  24. claude_mpm/cli/__init__.py +11 -1
  25. claude_mpm/cli/commands/aggregate.py +1 -1
  26. claude_mpm/cli/commands/analyze.py +3 -3
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  29. claude_mpm/cli/commands/debug.py +12 -12
  30. claude_mpm/cli/commands/hook_errors.py +277 -0
  31. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  32. claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
  33. claude_mpm/cli/commands/mpm_init/README.md +365 -0
  34. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  35. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  36. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  37. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  38. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  39. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  40. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  41. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  42. claude_mpm/cli/commands/run.py +124 -128
  43. claude_mpm/cli/commands/skills.py +522 -34
  44. claude_mpm/cli/executor.py +56 -0
  45. claude_mpm/cli/interactive/agent_wizard.py +5 -5
  46. claude_mpm/cli/parsers/base_parser.py +28 -0
  47. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  48. claude_mpm/cli/parsers/skills_parser.py +138 -0
  49. claude_mpm/cli/startup.py +111 -8
  50. claude_mpm/cli/startup_display.py +480 -0
  51. claude_mpm/cli/utils.py +1 -1
  52. claude_mpm/cli_module/commands.py +1 -1
  53. claude_mpm/cli_module/refactoring_guide.md +253 -0
  54. claude_mpm/commands/mpm-help.md +3 -0
  55. claude_mpm/commands/mpm-init.md +19 -3
  56. claude_mpm/commands/mpm-resume.md +372 -0
  57. claude_mpm/commands/mpm-tickets.md +56 -7
  58. claude_mpm/commands/mpm.md +1 -0
  59. claude_mpm/config/agent_capabilities.yaml +658 -0
  60. claude_mpm/config/async_logging_config.yaml +145 -0
  61. claude_mpm/constants.py +12 -0
  62. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
  63. claude_mpm/core/api_validator.py +1 -1
  64. claude_mpm/core/claude_runner.py +14 -1
  65. claude_mpm/core/config.py +8 -0
  66. claude_mpm/core/constants.py +1 -1
  67. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  68. claude_mpm/core/hook_error_memory.py +381 -0
  69. claude_mpm/core/hook_manager.py +41 -2
  70. claude_mpm/core/interactive_session.py +48 -3
  71. claude_mpm/core/interfaces.py +56 -1
  72. claude_mpm/core/logger.py +3 -1
  73. claude_mpm/core/oneshot_session.py +39 -0
  74. claude_mpm/d2/.gitignore +22 -0
  75. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
  76. claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
  77. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
  78. claude_mpm/d2/QUICKSTART.md +186 -0
  79. claude_mpm/d2/README.md +232 -0
  80. claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
  81. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
  82. claude_mpm/d2/TESTING.md +288 -0
  83. claude_mpm/d2/index.html +118 -0
  84. claude_mpm/d2/package.json +19 -0
  85. claude_mpm/d2/src/App.svelte +110 -0
  86. claude_mpm/d2/src/components/Header.svelte +153 -0
  87. claude_mpm/d2/src/components/MainContent.svelte +74 -0
  88. claude_mpm/d2/src/components/Sidebar.svelte +85 -0
  89. claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
  90. claude_mpm/d2/src/lib/socketio.js +144 -0
  91. claude_mpm/d2/src/main.js +7 -0
  92. claude_mpm/d2/src/stores/events.js +114 -0
  93. claude_mpm/d2/src/stores/socket.js +108 -0
  94. claude_mpm/d2/src/stores/theme.js +65 -0
  95. claude_mpm/d2/svelte.config.js +12 -0
  96. claude_mpm/d2/vite.config.js +15 -0
  97. claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
  98. claude_mpm/dashboard/BUILD_NUMBER +1 -0
  99. claude_mpm/dashboard/README.md +121 -0
  100. claude_mpm/dashboard/VERSION +1 -0
  101. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
  102. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
  103. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
  104. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
  105. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
  106. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
  107. claude_mpm/dashboard/react/entries/events.tsx +165 -0
  108. claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
  109. claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
  110. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
  111. claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
  112. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
  114. claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
  117. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
  118. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
  119. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
  120. claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
  121. claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
  122. claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
  123. claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
  124. claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
  125. claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
  126. claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
  127. claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
  128. claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
  129. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
  130. claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
  131. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
  132. claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
  133. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
  134. claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
  135. claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
  136. claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
  137. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
  138. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
  139. claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
  140. claude_mpm/dashboard/static/built/connection-manager.js +76 -76
  141. claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
  142. claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
  143. claude_mpm/dashboard/static/built/react/events.js.map +1 -0
  144. claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
  145. claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
  146. claude_mpm/dashboard/static/built/shared/logger.js +16 -16
  147. claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
  148. claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
  149. claude_mpm/dashboard/static/css/activity.css +69 -69
  150. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  151. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  152. claude_mpm/dashboard/static/index.html +22 -22
  153. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
  154. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  155. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  156. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  157. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  158. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  159. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  160. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  161. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  162. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  163. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  164. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  165. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  166. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  167. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  168. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  169. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  170. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  171. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  172. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  173. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  174. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  175. claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
  176. claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
  177. claude_mpm/dashboard/static/js/shared/logger.js +16 -16
  178. claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
  179. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  180. claude_mpm/dashboard/static/navigation-test-results.md +118 -0
  181. claude_mpm/dashboard/static/production/main.html +21 -21
  182. claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
  183. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
  184. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
  185. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
  186. claude_mpm/dashboard/templates/code_simple.html +23 -23
  187. claude_mpm/dashboard/templates/index.html +18 -18
  188. claude_mpm/hooks/README.md +143 -0
  189. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  190. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  191. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  192. claude_mpm/hooks/templates/README.md +180 -0
  193. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  194. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  195. claude_mpm/hooks/templates/settings.json.example +147 -0
  196. claude_mpm/schemas/agent_schema.json +596 -0
  197. claude_mpm/schemas/frontmatter_schema.json +165 -0
  198. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  199. claude_mpm/scripts/start_activity_logging.py +3 -1
  200. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  201. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  202. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  203. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  204. claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
  205. claude_mpm/services/agents/local_template_manager.py +3 -1
  206. claude_mpm/services/cli/session_pause_manager.py +504 -0
  207. claude_mpm/services/cli/session_resume_helper.py +36 -16
  208. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  209. claude_mpm/services/core/base.py +26 -11
  210. claude_mpm/services/core/interfaces.py +56 -1
  211. claude_mpm/services/core/models/agent_config.py +3 -0
  212. claude_mpm/services/core/models/process.py +4 -0
  213. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  214. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  215. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  216. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  217. claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
  218. claude_mpm/services/diagnostics/models.py +21 -0
  219. claude_mpm/services/event_bus/README.md +244 -0
  220. claude_mpm/services/event_bus/direct_relay.py +3 -3
  221. claude_mpm/services/event_bus/event_bus.py +36 -3
  222. claude_mpm/services/event_bus/relay.py +23 -7
  223. claude_mpm/services/events/README.md +303 -0
  224. claude_mpm/services/events/consumers/logging.py +1 -2
  225. claude_mpm/services/framework_claude_md_generator/README.md +119 -0
  226. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  227. claude_mpm/services/local_ops/__init__.py +2 -0
  228. claude_mpm/services/local_ops/process_manager.py +1 -1
  229. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  230. claude_mpm/services/mcp_gateway/README.md +185 -0
  231. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  232. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  233. claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
  234. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  235. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  236. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  237. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  238. claude_mpm/services/memory/failure_tracker.py +19 -4
  239. claude_mpm/services/memory/optimizer.py +1 -1
  240. claude_mpm/services/model/model_router.py +8 -9
  241. claude_mpm/services/monitor/daemon.py +1 -1
  242. claude_mpm/services/monitor/server.py +2 -2
  243. claude_mpm/services/native_agent_converter.py +356 -0
  244. claude_mpm/services/port_manager.py +1 -1
  245. claude_mpm/services/project/documentation_manager.py +2 -1
  246. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  247. claude_mpm/services/runner_configuration_service.py +1 -0
  248. claude_mpm/services/self_upgrade_service.py +165 -7
  249. claude_mpm/services/skills_config.py +547 -0
  250. claude_mpm/services/skills_deployer.py +955 -0
  251. claude_mpm/services/socketio/handlers/connection.py +1 -1
  252. claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
  253. claude_mpm/services/socketio/handlers/git.py +2 -2
  254. claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
  255. claude_mpm/services/static/.gitkeep +2 -0
  256. claude_mpm/services/system_instructions_service.py +1 -3
  257. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  258. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  259. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  260. claude_mpm/services/version_control/VERSION +1 -0
  261. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  262. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  263. claude_mpm/skills/__init__.py +3 -3
  264. claude_mpm/skills/agent_skills_injector.py +42 -49
  265. claude_mpm/skills/bundled/.gitkeep +2 -0
  266. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +4 -0
  267. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +108 -114
  268. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  269. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  270. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  271. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  272. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  273. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +46 -41
  274. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  275. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  276. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +36 -73
  277. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  278. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  279. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +100 -125
  280. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
  281. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  282. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  283. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  284. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  285. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +28 -72
  286. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +11 -0
  287. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  288. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  289. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +272 -0
  290. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  291. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  292. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  293. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  294. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  295. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  296. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  297. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  298. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  299. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  300. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
  301. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +13 -1
  302. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  303. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
  304. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  305. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
  306. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +11 -0
  307. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
  308. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +109 -277
  309. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  310. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  311. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  312. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  313. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
  314. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
  315. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
  316. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +135 -155
  317. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  318. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  319. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  320. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  321. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  322. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  323. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  324. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  325. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  326. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  327. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  328. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  329. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  330. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  331. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  332. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  333. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  334. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  335. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  336. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  337. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  338. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  339. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  340. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  341. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  342. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  343. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  344. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  345. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  346. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  347. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  348. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  349. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  350. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  351. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  352. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +21 -25
  353. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
  354. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  355. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  356. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  357. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  358. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  359. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  360. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +86 -250
  361. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  362. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  363. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  364. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  365. claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
  366. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +145 -57
  367. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  368. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  369. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  370. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  371. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  372. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  373. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  374. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  375. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  376. claude_mpm/skills/skills_registry.py +44 -48
  377. claude_mpm/skills/skills_service.py +117 -108
  378. claude_mpm/templates/questions/EXAMPLES.md +501 -0
  379. claude_mpm/templates/questions/__init__.py +43 -0
  380. claude_mpm/templates/questions/base.py +193 -0
  381. claude_mpm/templates/questions/pr_strategy.py +314 -0
  382. claude_mpm/templates/questions/project_init.py +388 -0
  383. claude_mpm/templates/questions/ticket_mgmt.py +397 -0
  384. claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
  385. claude_mpm/tools/__main__.py +8 -8
  386. claude_mpm/tools/code_tree_analyzer/README.md +64 -0
  387. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  388. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  389. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  390. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  391. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  392. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  393. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  394. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  395. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  396. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  397. claude_mpm/utils/agent_dependency_loader.py +3 -3
  398. claude_mpm/utils/dependency_cache.py +3 -1
  399. claude_mpm/utils/gitignore.py +241 -0
  400. claude_mpm/utils/log_cleanup.py +3 -3
  401. claude_mpm/utils/robust_installer.py +3 -5
  402. claude_mpm/utils/structured_questions.py +619 -0
  403. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/METADATA +218 -31
  404. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +409 -246
  405. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  406. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  407. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  408. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  409. claude_mpm/cli/commands/mpm_init.py +0 -2093
  410. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  411. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  412. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  413. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  414. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  415. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  416. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  417. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  418. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  419. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  420. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  421. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  422. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  423. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  424. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  425. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  426. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  427. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  428. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  429. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  430. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  444. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  445. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  446. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  447. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  448. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  449. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  450. /claude_mpm/skills/bundled/collaboration/requesting-code-review/{code-reviewer.md → references/code-reviewer-template.md} +0 -0
  451. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
  452. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
  453. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
  454. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,459 @@
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
+ ```
@@ -2,13 +2,13 @@ from playwright.sync_api import sync_playwright
2
2
 
3
3
  # Example: Capturing console logs during browser automation
4
4
 
5
- url = 'http://localhost:5173' # Replace with your URL
5
+ url = "http://localhost:5173" # Replace with your URL
6
6
 
7
7
  console_logs = []
8
8
 
9
9
  with sync_playwright() as p:
10
10
  browser = p.chromium.launch(headless=True)
11
- page = browser.new_page(viewport={'width': 1920, 'height': 1080})
11
+ page = browser.new_page(viewport={"width": 1920, "height": 1080})
12
12
 
13
13
  # Set up console log capture
14
14
  def handle_console_message(msg):
@@ -19,17 +19,17 @@ with sync_playwright() as p:
19
19
 
20
20
  # Navigate to page
21
21
  page.goto(url)
22
- page.wait_for_load_state('networkidle')
22
+ page.wait_for_load_state("networkidle")
23
23
 
24
24
  # Interact with the page (triggers console logs)
25
- page.click('text=Dashboard')
25
+ page.click("text=Dashboard")
26
26
  page.wait_for_timeout(1000)
27
27
 
28
28
  browser.close()
29
29
 
30
30
  # Save console logs to file
31
- with open('/mnt/user-data/outputs/console.log', 'w') as f:
32
- f.write('\n'.join(console_logs))
31
+ with open("/mnt/user-data/outputs/console.log", "w") as f:
32
+ f.write("\n".join(console_logs))
33
33
 
34
34
  print(f"\nCaptured {len(console_logs)} console messages")
35
35
  print("Logs saved to: /mnt/user-data/outputs/console.log")
@@ -7,34 +7,38 @@ with sync_playwright() as p:
7
7
  page = browser.new_page()
8
8
 
9
9
  # Navigate to page and wait for it to fully load
10
- page.goto('http://localhost:5173')
11
- page.wait_for_load_state('networkidle')
10
+ page.goto("http://localhost:5173")
11
+ page.wait_for_load_state("networkidle")
12
12
 
13
13
  # Discover all buttons on the page
14
- buttons = page.locator('button').all()
14
+ buttons = page.locator("button").all()
15
15
  print(f"Found {len(buttons)} buttons:")
16
16
  for i, button in enumerate(buttons):
17
17
  text = button.inner_text() if button.is_visible() else "[hidden]"
18
18
  print(f" [{i}] {text}")
19
19
 
20
20
  # Discover links
21
- links = page.locator('a[href]').all()
21
+ links = page.locator("a[href]").all()
22
22
  print(f"\nFound {len(links)} links:")
23
23
  for link in links[:5]: # Show first 5
24
24
  text = link.inner_text().strip()
25
- href = link.get_attribute('href')
25
+ href = link.get_attribute("href")
26
26
  print(f" - {text} -> {href}")
27
27
 
28
28
  # Discover input fields
29
- inputs = page.locator('input, textarea, select').all()
29
+ inputs = page.locator("input, textarea, select").all()
30
30
  print(f"\nFound {len(inputs)} input fields:")
31
31
  for input_elem in inputs:
32
- name = input_elem.get_attribute('name') or input_elem.get_attribute('id') or "[unnamed]"
33
- input_type = input_elem.get_attribute('type') or 'text'
32
+ name = (
33
+ input_elem.get_attribute("name")
34
+ or input_elem.get_attribute("id")
35
+ or "[unnamed]"
36
+ )
37
+ input_type = input_elem.get_attribute("type") or "text"
34
38
  print(f" - {name} ({input_type})")
35
39
 
36
40
  # Take screenshot for visual reference
37
- page.screenshot(path='/tmp/page_discovery.png', full_page=True)
41
+ page.screenshot(path="/tmp/page_discovery.png", full_page=True)
38
42
  print("\nScreenshot saved to /tmp/page_discovery.png")
39
43
 
40
44
  browser.close()
@@ -4,30 +4,30 @@ from playwright.sync_api import sync_playwright
4
4
 
5
5
  # Example: Automating interaction with static HTML files using file:// URLs
6
6
 
7
- html_file_path = os.path.abspath('path/to/your/file.html')
8
- file_url = f'file://{html_file_path}'
7
+ html_file_path = os.path.abspath("path/to/your/file.html")
8
+ file_url = f"file://{html_file_path}"
9
9
 
10
10
  with sync_playwright() as p:
11
11
  browser = p.chromium.launch(headless=True)
12
- page = browser.new_page(viewport={'width': 1920, 'height': 1080})
12
+ page = browser.new_page(viewport={"width": 1920, "height": 1080})
13
13
 
14
14
  # Navigate to local HTML file
15
15
  page.goto(file_url)
16
16
 
17
17
  # Take screenshot
18
- page.screenshot(path='/mnt/user-data/outputs/static_page.png', full_page=True)
18
+ page.screenshot(path="/mnt/user-data/outputs/static_page.png", full_page=True)
19
19
 
20
20
  # Interact with elements
21
- page.click('text=Click Me')
22
- page.fill('#name', 'John Doe')
23
- page.fill('#email', 'john@example.com')
21
+ page.click("text=Click Me")
22
+ page.fill("#name", "John Doe")
23
+ page.fill("#email", "john@example.com")
24
24
 
25
25
  # Submit form
26
26
  page.click('button[type="submit"]')
27
27
  page.wait_for_timeout(500)
28
28
 
29
29
  # Take final screenshot
30
- page.screenshot(path='/mnt/user-data/outputs/after_submit.png', full_page=True)
30
+ page.screenshot(path="/mnt/user-data/outputs/after_submit.png", full_page=True)
31
31
 
32
32
  browser.close()
33
33