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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +12 -0
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +632 -334
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/__init__.py +6 -0
  7. claude_mpm/agents/agent_loader.py +1 -4
  8. claude_mpm/agents/base_agent.json +6 -3
  9. claude_mpm/agents/frontmatter_validator.py +1 -1
  10. claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
  11. claude_mpm/agents/templates/context-management-examples.md +544 -0
  12. claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
  13. claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
  14. claude_mpm/agents/templates/research-gate-examples.md +669 -0
  15. claude_mpm/agents/templates/structured-questions-examples.md +615 -0
  16. claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
  17. claude_mpm/agents/templates/ticketing-examples.md +277 -0
  18. claude_mpm/cli/__init__.py +38 -2
  19. claude_mpm/cli/commands/agent_source.py +774 -0
  20. claude_mpm/cli/commands/agent_state_manager.py +125 -20
  21. claude_mpm/cli/commands/agents.py +684 -13
  22. claude_mpm/cli/commands/agents_cleanup.py +210 -0
  23. claude_mpm/cli/commands/agents_discover.py +338 -0
  24. claude_mpm/cli/commands/aggregate.py +1 -1
  25. claude_mpm/cli/commands/analyze.py +3 -3
  26. claude_mpm/cli/commands/auto_configure.py +2 -6
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/config.py +7 -4
  29. claude_mpm/cli/commands/configure.py +478 -44
  30. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  31. claude_mpm/cli/commands/configure_navigation.py +63 -46
  32. claude_mpm/cli/commands/debug.py +12 -12
  33. claude_mpm/cli/commands/doctor.py +10 -2
  34. claude_mpm/cli/commands/hook_errors.py +277 -0
  35. claude_mpm/cli/commands/local_deploy.py +1 -4
  36. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  37. claude_mpm/cli/commands/mpm_init/core.py +50 -2
  38. claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
  39. claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
  40. claude_mpm/cli/commands/run.py +124 -128
  41. claude_mpm/cli/commands/skill_source.py +694 -0
  42. claude_mpm/cli/commands/skills.py +435 -1
  43. claude_mpm/cli/executor.py +78 -3
  44. claude_mpm/cli/interactive/agent_wizard.py +919 -41
  45. claude_mpm/cli/parsers/agent_source_parser.py +171 -0
  46. claude_mpm/cli/parsers/agents_parser.py +173 -4
  47. claude_mpm/cli/parsers/base_parser.py +49 -0
  48. claude_mpm/cli/parsers/config_parser.py +96 -43
  49. claude_mpm/cli/parsers/skill_source_parser.py +169 -0
  50. claude_mpm/cli/parsers/skills_parser.py +138 -0
  51. claude_mpm/cli/parsers/source_parser.py +138 -0
  52. claude_mpm/cli/startup.py +499 -84
  53. claude_mpm/cli/startup_display.py +480 -0
  54. claude_mpm/cli/utils.py +1 -1
  55. claude_mpm/cli_module/commands.py +1 -1
  56. claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
  57. claude_mpm/commands/mpm-agents-detect.md +9 -0
  58. claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
  59. claude_mpm/commands/mpm-agents-recommend.md +9 -0
  60. claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
  61. claude_mpm/commands/mpm-doctor.md +9 -0
  62. claude_mpm/commands/mpm-help.md +11 -2
  63. claude_mpm/commands/mpm-init.md +27 -2
  64. claude_mpm/commands/mpm-monitor.md +9 -0
  65. claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
  66. claude_mpm/commands/mpm-status.md +9 -0
  67. claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
  68. claude_mpm/commands/mpm-ticket-view.md +552 -0
  69. claude_mpm/commands/mpm-version.md +9 -0
  70. claude_mpm/commands/mpm.md +10 -0
  71. claude_mpm/config/agent_presets.py +258 -0
  72. claude_mpm/config/agent_sources.py +325 -0
  73. claude_mpm/config/skill_sources.py +590 -0
  74. claude_mpm/constants.py +12 -0
  75. claude_mpm/core/api_validator.py +1 -1
  76. claude_mpm/core/claude_runner.py +17 -10
  77. claude_mpm/core/config.py +24 -0
  78. claude_mpm/core/constants.py +1 -1
  79. claude_mpm/core/framework/__init__.py +3 -16
  80. claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
  81. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  82. claude_mpm/core/hook_error_memory.py +381 -0
  83. claude_mpm/core/hook_manager.py +41 -2
  84. claude_mpm/core/interactive_session.py +112 -5
  85. claude_mpm/core/logger.py +3 -1
  86. claude_mpm/core/oneshot_session.py +94 -4
  87. claude_mpm/dashboard/static/css/activity.css +69 -69
  88. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  89. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  90. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  91. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  92. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  93. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  94. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  95. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  96. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  97. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  98. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  99. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  100. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  101. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  102. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  103. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  104. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  105. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  106. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  107. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  108. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  109. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  110. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  111. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  112. claude_mpm/dashboard/templates/code_simple.html +23 -23
  113. claude_mpm/dashboard/templates/index.html +18 -18
  114. claude_mpm/experimental/cli_enhancements.py +1 -5
  115. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  116. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  117. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  118. claude_mpm/hooks/failure_learning/__init__.py +2 -8
  119. claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
  120. claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
  121. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
  122. claude_mpm/hooks/kuzu_response_hook.py +1 -5
  123. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  124. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  125. claude_mpm/models/git_repository.py +198 -0
  126. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  127. claude_mpm/scripts/start_activity_logging.py +3 -1
  128. claude_mpm/services/agents/agent_builder.py +45 -9
  129. claude_mpm/services/agents/agent_preset_service.py +238 -0
  130. claude_mpm/services/agents/agent_selection_service.py +484 -0
  131. claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
  132. claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
  133. claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
  134. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  135. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
  136. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  137. claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
  138. claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
  139. claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
  140. claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
  141. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  142. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
  143. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  144. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
  145. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
  146. claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
  147. claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
  148. claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
  149. claude_mpm/services/agents/git_source_manager.py +629 -0
  150. claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
  151. claude_mpm/services/agents/local_template_manager.py +50 -10
  152. claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
  153. claude_mpm/services/agents/sources/__init__.py +13 -0
  154. claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
  155. claude_mpm/services/agents/sources/git_source_sync_service.py +1055 -0
  156. claude_mpm/services/agents/startup_sync.py +239 -0
  157. claude_mpm/services/agents/toolchain_detector.py +474 -0
  158. claude_mpm/services/cli/session_pause_manager.py +1 -1
  159. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  160. claude_mpm/services/command_deployment_service.py +92 -1
  161. claude_mpm/services/core/interfaces/__init__.py +1 -3
  162. claude_mpm/services/core/interfaces/health.py +1 -4
  163. claude_mpm/services/core/models/__init__.py +2 -11
  164. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  165. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  166. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  167. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  168. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  169. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  170. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  171. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  172. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  173. claude_mpm/services/event_bus/direct_relay.py +3 -3
  174. claude_mpm/services/event_bus/event_bus.py +36 -3
  175. claude_mpm/services/events/consumers/logging.py +1 -2
  176. claude_mpm/services/git/__init__.py +21 -0
  177. claude_mpm/services/git/git_operations_service.py +494 -0
  178. claude_mpm/services/github/__init__.py +21 -0
  179. claude_mpm/services/github/github_cli_service.py +397 -0
  180. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  181. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  182. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  183. claude_mpm/services/instructions/__init__.py +9 -0
  184. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  185. claude_mpm/services/local_ops/__init__.py +3 -13
  186. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  187. claude_mpm/services/local_ops/health_manager.py +1 -4
  188. claude_mpm/services/local_ops/process_manager.py +1 -1
  189. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  190. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  191. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  192. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  193. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  194. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  195. claude_mpm/services/memory/optimizer.py +1 -1
  196. claude_mpm/services/model/model_router.py +8 -9
  197. claude_mpm/services/monitor/daemon.py +1 -1
  198. claude_mpm/services/monitor/server.py +2 -2
  199. claude_mpm/services/native_agent_converter.py +356 -0
  200. claude_mpm/services/port_manager.py +1 -1
  201. claude_mpm/services/pr/__init__.py +14 -0
  202. claude_mpm/services/pr/pr_template_service.py +329 -0
  203. claude_mpm/services/project/documentation_manager.py +2 -1
  204. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  205. claude_mpm/services/runner_configuration_service.py +1 -0
  206. claude_mpm/services/self_upgrade_service.py +165 -7
  207. claude_mpm/services/skills/__init__.py +18 -0
  208. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  209. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  210. claude_mpm/services/skills_config.py +547 -0
  211. claude_mpm/services/skills_deployer.py +955 -0
  212. claude_mpm/services/socketio/handlers/connection.py +1 -1
  213. claude_mpm/services/socketio/handlers/git.py +2 -2
  214. claude_mpm/services/socketio/server/core.py +1 -4
  215. claude_mpm/services/socketio/server/main.py +1 -3
  216. claude_mpm/services/system_instructions_service.py +1 -3
  217. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  218. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  219. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  220. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  221. claude_mpm/services/unified/unified_deployment.py +1 -5
  222. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  223. claude_mpm/services/visualization/__init__.py +1 -5
  224. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  225. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  226. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  227. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  228. claude_mpm/skills/skills_registry.py +0 -1
  229. claude_mpm/templates/questions/__init__.py +38 -0
  230. claude_mpm/templates/questions/base.py +193 -0
  231. claude_mpm/templates/questions/pr_strategy.py +311 -0
  232. claude_mpm/templates/questions/project_init.py +385 -0
  233. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  234. claude_mpm/tools/__main__.py +8 -8
  235. claude_mpm/tools/code_tree_analyzer/analysis.py +1 -1
  236. claude_mpm/utils/agent_dependency_loader.py +80 -13
  237. claude_mpm/utils/dependency_cache.py +3 -1
  238. claude_mpm/utils/gitignore.py +241 -0
  239. claude_mpm/utils/log_cleanup.py +3 -3
  240. claude_mpm/utils/progress.py +383 -0
  241. claude_mpm/utils/robust_installer.py +3 -5
  242. claude_mpm/utils/structured_questions.py +619 -0
  243. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
  244. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +252 -425
  245. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  246. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  247. claude_mpm/agents/templates/agent-manager.json +0 -273
  248. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  249. claude_mpm/agents/templates/api_qa.json +0 -180
  250. claude_mpm/agents/templates/clerk-ops.json +0 -235
  251. claude_mpm/agents/templates/code_analyzer.json +0 -101
  252. claude_mpm/agents/templates/content-agent.json +0 -358
  253. claude_mpm/agents/templates/dart_engineer.json +0 -307
  254. claude_mpm/agents/templates/data_engineer.json +0 -225
  255. claude_mpm/agents/templates/documentation.json +0 -211
  256. claude_mpm/agents/templates/engineer.json +0 -210
  257. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  258. claude_mpm/agents/templates/golang_engineer.json +0 -270
  259. claude_mpm/agents/templates/imagemagick.json +0 -264
  260. claude_mpm/agents/templates/java_engineer.json +0 -346
  261. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  262. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  263. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  264. claude_mpm/agents/templates/memory_manager.json +0 -158
  265. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  266. claude_mpm/agents/templates/ops.json +0 -185
  267. claude_mpm/agents/templates/php-engineer.json +0 -287
  268. claude_mpm/agents/templates/product_owner.json +0 -338
  269. claude_mpm/agents/templates/project_organizer.json +0 -140
  270. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  271. claude_mpm/agents/templates/python_engineer.json +0 -387
  272. claude_mpm/agents/templates/qa.json +0 -242
  273. claude_mpm/agents/templates/react_engineer.json +0 -238
  274. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  275. claude_mpm/agents/templates/research.json +0 -188
  276. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  277. claude_mpm/agents/templates/rust_engineer.json +0 -275
  278. claude_mpm/agents/templates/security.json +0 -202
  279. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  280. claude_mpm/agents/templates/ticketing.json +0 -177
  281. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  282. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  283. claude_mpm/agents/templates/version_control.json +0 -157
  284. claude_mpm/agents/templates/web_qa.json +0 -399
  285. claude_mpm/agents/templates/web_ui.json +0 -189
  286. claude_mpm/commands/mpm-tickets.md +0 -102
  287. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  288. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  289. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  290. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  291. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  292. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  293. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  294. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  295. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  296. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  297. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  298. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  299. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  300. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  301. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  302. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  303. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  304. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  305. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  306. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  307. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  308. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  309. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  310. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  311. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  312. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  313. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  314. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  315. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  316. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  317. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  318. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  319. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  320. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  321. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  322. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  323. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  324. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  325. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  326. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  327. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  328. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  329. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  330. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  331. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  332. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  333. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  334. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  335. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  336. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  337. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  338. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  339. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  340. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  341. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  342. claude_mpm/dashboard/static/built/react/events.js +0 -30
  343. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  344. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  345. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  346. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  347. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  348. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  349. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  350. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  351. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  352. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  353. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  354. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  355. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  356. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  357. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  358. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  359. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  360. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  361. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  362. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  363. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  364. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  365. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  366. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  367. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  368. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  369. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  370. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  371. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  372. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  373. claude_mpm/dashboard/static/events.html +0 -607
  374. claude_mpm/dashboard/static/index.html +0 -635
  375. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  376. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  377. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  378. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  379. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  380. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  381. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  382. claude_mpm/dashboard/static/legacy/files.html +0 -747
  383. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  384. claude_mpm/dashboard/static/monitors.html +0 -431
  385. claude_mpm/dashboard/static/production/events.html +0 -659
  386. claude_mpm/dashboard/static/production/main.html +0 -698
  387. claude_mpm/dashboard/static/production/monitors.html +0 -483
  388. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  389. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  390. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  391. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  392. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  393. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  394. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  395. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  396. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  397. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  398. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  399. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  400. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  401. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  402. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  403. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  404. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  405. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  406. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  407. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  408. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  409. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  410. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  411. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  412. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  413. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  414. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  415. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  416. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  417. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  418. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  419. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  420. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  421. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  422. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  423. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  424. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  425. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  426. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  427. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  428. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  429. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  430. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  431. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  432. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  433. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  434. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  435. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  436. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  437. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  438. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  439. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  440. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  441. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  442. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  443. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  444. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  445. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  446. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  447. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  448. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  449. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  450. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  451. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  452. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  453. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  454. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  455. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  456. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  457. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  458. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  459. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  460. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  461. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  462. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  463. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  464. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  465. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  466. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  467. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  468. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  469. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  470. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  471. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  472. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  473. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  474. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  475. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  476. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  477. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  478. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  479. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  480. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  481. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
  482. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
  483. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
  484. {claude_mpm-4.21.3.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
@@ -1,569 +0,0 @@
1
- # Detection Guide: Identifying Testing Anti-Patterns
2
-
3
- Comprehensive guide for detecting testing anti-patterns before they cause problems. Includes red flags, warning signs, gate functions, and diagnostic checklists.
4
-
5
- ## Overview
6
-
7
- Prevention is easier than cure. This guide helps you identify anti-patterns during code review, test writing, or debugging test failures.
8
-
9
- ## Universal Detection Checklist
10
-
11
- Run before committing any test:
12
-
13
- ```
14
- □ Am I asserting on mock elements? (testId='*-mock')
15
- → If yes: STOP - Test real component or unmock
16
-
17
- □ Does this method only exist for tests?
18
- → If yes: STOP - Move to test utilities
19
-
20
- □ Do I fully understand what I'm mocking?
21
- → If no: STOP - Run with real impl first, then mock minimally
22
-
23
- □ Is my mock missing fields the real API has?
24
- → If yes: STOP - Mirror complete API structure
25
-
26
- □ Did I write implementation before test?
27
- → If yes: STOP - Delete impl, write test first (TDD)
28
-
29
- □ Is mock setup >50% of test code?
30
- → If yes: Consider integration test with real components
31
-
32
- □ Can I explain what real behavior this test verifies?
33
- → If no: STOP - Clarify what you're testing
34
-
35
- □ Would this test fail if I removed mocks?
36
- → If no: You're testing mock behavior
37
- ```
38
-
39
- ## Anti-Pattern 1: Testing Mock Behavior
40
-
41
- ### Red Flags
42
-
43
- **Code indicators:**
44
- ```typescript
45
- // 🚩 Test ID contains "mock"
46
- expect(screen.getByTestId('sidebar-mock')).toBeInTheDocument();
47
-
48
- // 🚩 Asserting mock was called
49
- expect(mockFunction).toHaveBeenCalled();
50
-
51
- // 🚩 Checking mock return values
52
- expect(result).toBe(mockReturnValue);
53
-
54
- // 🚩 Test fails when mock removed
55
- // Remove mock → test fails → you're testing mock
56
- ```
57
-
58
- **Language patterns:**
59
- - "Make sure the mock..."
60
- - "Test that component renders mock"
61
- - "Verify mock is present"
62
- - "Check if mock function called"
63
-
64
- **Diagnostic questions:**
65
- 1. **"If I remove this mock, does test still make sense?"**
66
- - No → You're testing mock behavior
67
- - Yes → Good, test tests real behavior
68
-
69
- 2. **"What production behavior does this verify?"**
70
- - Can't answer → Testing mock behavior
71
- - Clear answer → Good
72
-
73
- 3. **"Would this test catch real bugs?"**
74
- - No → Testing mock behavior
75
- - Yes → Good
76
-
77
- ### Detection Script
78
-
79
- ```typescript
80
- // Run this check on your tests
81
- function detectsMockTesting(testFile: string): string[] {
82
- const warnings: string[] = [];
83
-
84
- // Pattern: testId with 'mock'
85
- if (testFile.includes("getByTestId('") && testFile.includes('-mock')) {
86
- warnings.push('Testing mock element by test ID');
87
- }
88
-
89
- // Pattern: expecting on mock objects
90
- if (testFile.includes('expect(mock') && testFile.includes('toBe')) {
91
- warnings.push('Asserting on mock values');
92
- }
93
-
94
- // Pattern: mock call assertions without behavior check
95
- if (testFile.includes('toHaveBeenCalled') &&
96
- !testFile.includes('expect(result)')) {
97
- warnings.push('Only checking mock calls, not results');
98
- }
99
-
100
- return warnings;
101
- }
102
- ```
103
-
104
- ## Anti-Pattern 2: Test-Only Methods in Production
105
-
106
- ### Red Flags
107
-
108
- **Code indicators:**
109
- ```typescript
110
- // 🚩 Method only called in test files
111
- // Search: "destroy(" → Only in *.test.ts files
112
-
113
- // 🚩 Method names suggesting test use
114
- class Session {
115
- reset() // 🚩
116
- destroy() // 🚩
117
- clear() // 🚩
118
- mock() // 🚩
119
- }
120
-
121
- // 🚩 Comments acknowledging test-only use
122
- // "For testing only"
123
- // "Used by test cleanup"
124
- ```
125
-
126
- **File analysis:**
127
- ```bash
128
- # Find methods only called in tests
129
- grep -r "\.destroy\(" --include="*.ts" | grep -v ".test.ts"
130
- # If empty → method only in tests → move to test utils
131
- ```
132
-
133
- **Diagnostic questions:**
134
- 1. **"Is this method called outside test files?"**
135
- - No → Test-only method, move to utilities
136
- - Yes → Keep in production
137
-
138
- 2. **"Would production code ever need this?"**
139
- - No → Move to test utilities
140
- - Yes → Keep in production
141
-
142
- 3. **"Does this class own this resource's lifecycle?"**
143
- - No → Wrong place for this method
144
- - Yes → Consider if needed in production
145
-
146
- ### Detection Script
147
-
148
- ```typescript
149
- // Analyze method usage
150
- function findTestOnlyMethods(codebase: string[]): Report {
151
- const methods = extractMethods(codebase);
152
-
153
- return methods.filter(method => {
154
- const usages = findUsages(method);
155
- const testUsages = usages.filter(u => u.file.includes('.test.'));
156
- const prodUsages = usages.filter(u => !u.file.includes('.test.'));
157
-
158
- return testUsages.length > 0 && prodUsages.length === 0;
159
- });
160
- }
161
- ```
162
-
163
- ## Anti-Pattern 3: Mocking Without Understanding
164
-
165
- ### Red Flags
166
-
167
- **Code indicators:**
168
- ```typescript
169
- // 🚩 Mocking without reading implementation
170
- vi.mock('SomeModule'); // What does it do? Unknown.
171
-
172
- // 🚩 "Just to be safe" mocking
173
- // Mock everything, understand nothing
174
-
175
- // 🚩 Test mysteriously fails/passes
176
- // You can't explain why
177
-
178
- // 🚩 Mock prevents test logic from working
179
- vi.mock('UserService'); // Breaks user creation test needs
180
- ```
181
-
182
- **Language patterns:**
183
- - "I'll mock this to be safe"
184
- - "This might be slow"
185
- - "Let's mock everything"
186
- - "Not sure why test fails"
187
-
188
- **Diagnostic questions:**
189
- 1. **"What side effects does the real method have?"**
190
- - Can't answer → Don't mock yet
191
- - Know all effects → Can mock safely
192
-
193
- 2. **"Does my test depend on any of those side effects?"**
194
- - Yes → Don't mock at this level
195
- - No → Safe to mock
196
-
197
- 3. **"Where is the actual slow/external operation?"**
198
- - Unclear → Study code first
199
- - Clear → Mock at that level
200
-
201
- ### Detection Strategy
202
-
203
- **Before mocking:**
204
- ```
205
- 1. Read the implementation
206
- - What does it do?
207
- - What are side effects?
208
- - What does it return?
209
-
210
- 2. Run test with real implementation
211
- - How slow is it? (measure!)
212
- - What behavior occurs?
213
- - What's actually needed?
214
-
215
- 3. Identify minimal mock point
216
- - Where is the slow/external operation?
217
- - Can I mock below this level?
218
- - What behavior must be preserved?
219
-
220
- 4. Mock at correct level
221
- - Mock boundary of slow operation
222
- - Preserve logic test depends on
223
- - Verify test still tests intended behavior
224
- ```
225
-
226
- ### Speed Measurement
227
-
228
- ```typescript
229
- // Measure before mocking
230
- test('user registration', async () => {
231
- const start = performance.now();
232
- await registerUser(userData);
233
- const duration = performance.now() - start;
234
-
235
- console.log(`Test took ${duration}ms`);
236
- // If <100ms → Don't mock
237
- // If >1000ms → Identify slow part
238
- });
239
- ```
240
-
241
- ## Anti-Pattern 4: Incomplete Mocks
242
-
243
- ### Red Flags
244
-
245
- **Code indicators:**
246
- ```typescript
247
- // 🚩 Mock created from memory
248
- const mock = { id: '123' }; // What other fields exist?
249
-
250
- // 🚩 Partial type annotation
251
- const mock: Partial<User> = { id: '123' };
252
-
253
- // 🚩 Different tests, different mock shapes
254
- // test1.ts: { id, name }
255
- // test2.ts: { id, name, email, profile }
256
-
257
- // 🚩 Comment acknowledging incompleteness
258
- // "TODO: add more fields"
259
- // "Add fields as needed"
260
- ```
261
-
262
- **Missing documentation:**
263
- - No reference to API docs
264
- - No TypeScript interface
265
- - No factory function
266
- - Copy-pasted mock variations
267
-
268
- **Diagnostic questions:**
269
- 1. **"What does the real API return?"**
270
- - Can't answer → Check docs before mocking
271
- - Know structure → Use it in mock
272
-
273
- 2. **"Am I using TypeScript types?"**
274
- - No → Add types to enforce completeness
275
- - Yes → Good
276
-
277
- 3. **"Do other tests mock this differently?"**
278
- - Yes → Inconsistent mocks, need factory
279
- - No → Good
280
-
281
- ### Detection Script
282
-
283
- ```typescript
284
- // Find incomplete mocks
285
- function detectIncompleteMocks(testFile: string): Warning[] {
286
- const warnings: Warning[] = [];
287
-
288
- // Pattern: Partial<T> in test
289
- if (testFile.includes('Partial<') && testFile.includes('mock')) {
290
- warnings.push('Using Partial type for mock - likely incomplete');
291
- }
292
-
293
- // Pattern: Object literals without types
294
- const mockPattern = /const mock\w+ = \{[^}]+\};/g;
295
- const mocks = testFile.match(mockPattern);
296
-
297
- if (mocks) {
298
- mocks.forEach(mock => {
299
- if (!mock.includes(': ')) { // No type annotation
300
- warnings.push('Mock without type annotation');
301
- }
302
- });
303
- }
304
-
305
- return warnings;
306
- }
307
- ```
308
-
309
- ### Completeness Checklist
310
-
311
- ```
312
- □ Referenced API documentation
313
- □ Used TypeScript interface/type
314
- □ Included all required fields
315
- □ Included optional fields (as null/undefined)
316
- □ Nested objects complete
317
- □ Arrays have realistic length/content
318
- □ Metadata fields included
319
- □ Timestamps/IDs present
320
- ```
321
-
322
- ## Anti-Pattern 5: Tests as Afterthought
323
-
324
- ### Red Flags
325
-
326
- **Process indicators:**
327
- ```
328
- 🚩 PR has implementation commits, then "add tests" commit
329
- 🚩 "Ready for testing" status on untested feature
330
- 🚩 Test coverage added after code review
331
- 🚩 Tests written to pass, not fail first
332
- 🚩 Implementation complete, tests pending
333
- ```
334
-
335
- **Language patterns:**
336
- - "I'll add tests next"
337
- - "Implementation done, needs tests"
338
- - "Ready for testing phase"
339
- - "Tests coming soon"
340
-
341
- **Code indicators:**
342
- ```typescript
343
- // 🚩 Tests that can't fail
344
- test('feature works', () => {
345
- const result = newFeature();
346
- expect(result).toBe(result); // Always passes
347
- });
348
-
349
- // 🚩 Tests with no assertions
350
- test('feature runs', () => {
351
- newFeature(); // No expect()
352
- });
353
- ```
354
-
355
- **Diagnostic questions:**
356
- 1. **"Did I write test before implementation?"**
357
- - No → Not following TDD
358
- - Yes → Good
359
-
360
- 2. **"Did I watch test fail first?"**
361
- - No → Can't verify test works
362
- - Yes → Good
363
-
364
- 3. **"Are there commits without tests?"**
365
- - Yes → Tests afterthought
366
- - No → Good
367
-
368
- ### Git History Analysis
369
-
370
- ```bash
371
- # Check if tests come after implementation
372
- git log --oneline --name-only | grep -A5 "feature"
373
-
374
- # Red flag pattern:
375
- # abc123 Add feature X
376
- # src/feature.ts
377
- # def456 Add tests for feature X ← Tests after
378
- # src/feature.test.ts
379
-
380
- # Good pattern:
381
- # abc123 Add feature X with tests
382
- # src/feature.test.ts ← Test file in same commit
383
- # src/feature.ts
384
- ```
385
-
386
- ## Warning Signs: When Mocks Become Too Complex
387
-
388
- ### Complexity Indicators
389
-
390
- ```typescript
391
- // 🚩 Mock setup longer than test
392
- const setup = 50 lines;
393
- const test = 10 lines;
394
- // Ratio > 3:1 → Too complex
395
-
396
- // 🚩 Mocking everything
397
- vi.mock('ModuleA');
398
- vi.mock('ModuleB');
399
- vi.mock('ModuleC');
400
- vi.mock('ModuleD');
401
- // 4+ mocks → Consider integration test
402
-
403
- // 🚩 Nested mock setup
404
- const mockA = { mock: mockB };
405
- const mockB = { mock: mockC };
406
- const mockC = { /* ... */ };
407
-
408
- // 🚩 Mock setup in beforeEach for single test
409
- beforeEach(() => {
410
- // 30 lines of setup
411
- });
412
-
413
- test('one thing', () => {
414
- // 5 lines
415
- });
416
- ```
417
-
418
- **Your human partner's question:** "Do we need to be using a mock here?"
419
-
420
- **Consider:** Integration tests with real components often simpler than complex mocks.
421
-
422
- ### Complexity Metrics
423
-
424
- ```typescript
425
- function calculateMockComplexity(test: TestFile): ComplexityScore {
426
- return {
427
- mockCount: countMocks(test), // >4 is high
428
- setupLines: countSetupLines(test), // >30 is high
429
- setupToTestRatio: setupLines / testLines, // >3 is high
430
- mockNestingDepth: calculateNesting(test), // >2 is high
431
-
432
- recommendation: score > 10 ? 'Use integration test' : 'OK'
433
- };
434
- }
435
- ```
436
-
437
- ## Comprehensive Code Review Checklist
438
-
439
- Use this when reviewing tests (yours or others'):
440
-
441
- ### Structure
442
- ```
443
- □ Test files exist for new code
444
- □ Tests in same commit as implementation
445
- □ Tests follow TDD pattern (fail first)
446
- □ Clear test names describe behavior
447
- ```
448
-
449
- ### Mock Usage
450
- ```
451
- □ Mocks used sparingly (only when needed)
452
- □ Mock setup is simple (<20 lines)
453
- □ Mocks at correct level (I/O boundaries)
454
- □ No assertions on mock elements
455
- □ Complete mock structures (all fields)
456
- ```
457
-
458
- ### Production Code
459
- ```
460
- □ No test-only methods in production classes
461
- □ No test-specific logic in production
462
- □ Clean separation of concerns
463
- □ No test imports in production code
464
- ```
465
-
466
- ### Test Quality
467
- ```
468
- □ Tests verify real behavior
469
- □ Assertions on meaningful results
470
- □ Edge cases covered
471
- □ Error conditions tested
472
- □ Integration tests for critical paths
473
- ```
474
-
475
- ### Red Flags
476
- ```
477
- □ No 'testId="*-mock"' assertions
478
- □ No Partial<T> for mocks
479
- □ No "for testing" comments in production
480
- □ No untested implementation commits
481
- ```
482
-
483
- ## Automated Detection Tools
484
-
485
- ### ESLint Rules
486
-
487
- ```javascript
488
- // .eslintrc.js
489
- module.exports = {
490
- rules: {
491
- // Prevent test-only methods
492
- 'no-restricted-syntax': [
493
- 'error',
494
- {
495
- selector: 'MethodDefinition[key.name=/^(reset|destroy|clear|mock)$/]',
496
- message: 'Potential test-only method in production code'
497
- }
498
- ],
499
-
500
- // Prevent mock test IDs
501
- 'testing-library/prefer-screen-queries': 'error',
502
- 'testing-library/no-node-access': 'error',
503
- }
504
- };
505
- ```
506
-
507
- ### Pre-commit Hook
508
-
509
- ```bash
510
- #!/bin/bash
511
- # .git/hooks/pre-commit
512
-
513
- # Check for mock test IDs
514
- if git diff --cached | grep -q "testId=.*-mock"; then
515
- echo "Error: Found mock test ID in tests"
516
- echo "Are you testing mock behavior?"
517
- exit 1
518
- fi
519
-
520
- # Check for test-only methods
521
- if git diff --cached -- "*.ts" "*.js" | \
522
- grep -v ".test." | \
523
- grep -q "destroy()\|reset()\|clear()"; then
524
- echo "Warning: Potential test-only method in production code"
525
- fi
526
-
527
- # Check test coverage
528
- npm test -- --coverage --coverageThreshold='{"global":{"lines":80}}'
529
- ```
530
-
531
- ## Quick Reference: Detection Summary
532
-
533
- | Anti-Pattern | Key Indicator | Quick Check |
534
- |--------------|---------------|-------------|
535
- | Testing Mock Behavior | testId='*-mock' | Remove mock - test still valid? |
536
- | Test-Only Methods | Method only in .test. files | grep production files |
537
- | Mocking Without Understanding | Can't explain why mocking | Read implementation first |
538
- | Incomplete Mocks | Partial<T> or no types | Check against API docs |
539
- | Tests as Afterthought | Implementation before tests | Check git history |
540
-
541
- ## When to Seek Help
542
-
543
- **STOP and ask your human partner if:**
544
- - Mock setup exceeds 50 lines
545
- - You've mocked >5 modules in one test
546
- - Test mysteriously passes/fails
547
- - You can't explain what test verifies
548
- - Same test needs different mocks in different runs
549
- - Integration test seems simpler than mocks
550
-
551
- **Questions to ask:**
552
- - "Do we need to be using a mock here?"
553
- - "Should this be an integration test?"
554
- - "Am I testing the right thing?"
555
- - "Is this test-only method necessary?"
556
-
557
- ## Prevention Mindset
558
-
559
- **Before writing any test:**
560
- 1. Understand what you're testing (real behavior)
561
- 2. Write test first (TDD)
562
- 3. Watch it fail
563
- 4. Minimal implementation
564
- 5. Watch it pass
565
- 6. Refactor
566
-
567
- **This workflow prevents all five anti-patterns naturally.**
568
-
569
- See [test-driven-development skill](../../test-driven-development/) for complete TDD workflow.