claude-mpm 4.21.0__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 (497) 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 +14 -2
  63. claude_mpm/commands/mpm-init.md +27 -2
  64. claude_mpm/commands/mpm-monitor.md +9 -0
  65. claude_mpm/commands/mpm-session-resume.md +381 -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 +11 -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/base.py +26 -11
  162. claude_mpm/services/core/interfaces/__init__.py +1 -3
  163. claude_mpm/services/core/interfaces/health.py +1 -4
  164. claude_mpm/services/core/models/__init__.py +2 -11
  165. claude_mpm/services/diagnostics/checks/__init__.py +4 -0
  166. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  167. claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
  168. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  169. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  170. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  171. claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
  172. claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
  173. claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
  174. claude_mpm/services/event_bus/direct_relay.py +3 -3
  175. claude_mpm/services/event_bus/event_bus.py +36 -3
  176. claude_mpm/services/event_bus/relay.py +23 -7
  177. claude_mpm/services/events/consumers/logging.py +1 -2
  178. claude_mpm/services/git/__init__.py +21 -0
  179. claude_mpm/services/git/git_operations_service.py +494 -0
  180. claude_mpm/services/github/__init__.py +21 -0
  181. claude_mpm/services/github/github_cli_service.py +397 -0
  182. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
  183. claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
  184. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  185. claude_mpm/services/instructions/__init__.py +9 -0
  186. claude_mpm/services/instructions/instruction_cache_service.py +374 -0
  187. claude_mpm/services/local_ops/__init__.py +3 -13
  188. claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
  189. claude_mpm/services/local_ops/health_manager.py +1 -4
  190. claude_mpm/services/local_ops/process_manager.py +1 -1
  191. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  192. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  193. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
  194. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  195. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  196. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  197. claude_mpm/services/memory/failure_tracker.py +19 -4
  198. claude_mpm/services/memory/optimizer.py +1 -1
  199. claude_mpm/services/model/model_router.py +8 -9
  200. claude_mpm/services/monitor/daemon.py +1 -1
  201. claude_mpm/services/monitor/server.py +2 -2
  202. claude_mpm/services/native_agent_converter.py +356 -0
  203. claude_mpm/services/port_manager.py +1 -1
  204. claude_mpm/services/pr/__init__.py +14 -0
  205. claude_mpm/services/pr/pr_template_service.py +329 -0
  206. claude_mpm/services/project/documentation_manager.py +2 -1
  207. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  208. claude_mpm/services/runner_configuration_service.py +1 -0
  209. claude_mpm/services/self_upgrade_service.py +165 -7
  210. claude_mpm/services/skills/__init__.py +18 -0
  211. claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
  212. claude_mpm/services/skills/skill_discovery_service.py +568 -0
  213. claude_mpm/services/skills_config.py +547 -0
  214. claude_mpm/services/skills_deployer.py +955 -0
  215. claude_mpm/services/socketio/handlers/connection.py +1 -1
  216. claude_mpm/services/socketio/handlers/git.py +2 -2
  217. claude_mpm/services/socketio/server/core.py +1 -4
  218. claude_mpm/services/socketio/server/main.py +1 -3
  219. claude_mpm/services/system_instructions_service.py +1 -3
  220. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  221. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  222. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  223. claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
  224. claude_mpm/services/unified/unified_deployment.py +1 -5
  225. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  226. claude_mpm/services/visualization/__init__.py +1 -5
  227. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  228. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  229. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  230. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
  231. claude_mpm/skills/skills_registry.py +0 -1
  232. claude_mpm/templates/questions/__init__.py +38 -0
  233. claude_mpm/templates/questions/base.py +193 -0
  234. claude_mpm/templates/questions/pr_strategy.py +311 -0
  235. claude_mpm/templates/questions/project_init.py +385 -0
  236. claude_mpm/templates/questions/ticket_mgmt.py +394 -0
  237. claude_mpm/tools/__main__.py +8 -8
  238. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  239. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  240. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  241. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  242. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  243. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  244. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  245. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  246. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  247. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  248. claude_mpm/utils/agent_dependency_loader.py +80 -13
  249. claude_mpm/utils/dependency_cache.py +3 -1
  250. claude_mpm/utils/gitignore.py +241 -0
  251. claude_mpm/utils/log_cleanup.py +3 -3
  252. claude_mpm/utils/progress.py +383 -0
  253. claude_mpm/utils/robust_installer.py +3 -5
  254. claude_mpm/utils/structured_questions.py +619 -0
  255. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
  256. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +264 -427
  257. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  258. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  259. claude_mpm/agents/templates/agent-manager.json +0 -273
  260. claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
  261. claude_mpm/agents/templates/api_qa.json +0 -180
  262. claude_mpm/agents/templates/clerk-ops.json +0 -235
  263. claude_mpm/agents/templates/code_analyzer.json +0 -101
  264. claude_mpm/agents/templates/content-agent.json +0 -358
  265. claude_mpm/agents/templates/dart_engineer.json +0 -307
  266. claude_mpm/agents/templates/data_engineer.json +0 -225
  267. claude_mpm/agents/templates/documentation.json +0 -211
  268. claude_mpm/agents/templates/engineer.json +0 -210
  269. claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
  270. claude_mpm/agents/templates/golang_engineer.json +0 -270
  271. claude_mpm/agents/templates/imagemagick.json +0 -264
  272. claude_mpm/agents/templates/java_engineer.json +0 -346
  273. claude_mpm/agents/templates/local_ops_agent.json +0 -1840
  274. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  275. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  276. claude_mpm/agents/templates/memory_manager.json +0 -158
  277. claude_mpm/agents/templates/nextjs_engineer.json +0 -285
  278. claude_mpm/agents/templates/ops.json +0 -185
  279. claude_mpm/agents/templates/php-engineer.json +0 -287
  280. claude_mpm/agents/templates/product_owner.json +0 -338
  281. claude_mpm/agents/templates/project_organizer.json +0 -140
  282. claude_mpm/agents/templates/prompt-engineer.json +0 -737
  283. claude_mpm/agents/templates/python_engineer.json +0 -387
  284. claude_mpm/agents/templates/qa.json +0 -242
  285. claude_mpm/agents/templates/react_engineer.json +0 -238
  286. claude_mpm/agents/templates/refactoring_engineer.json +0 -276
  287. claude_mpm/agents/templates/research.json +0 -188
  288. claude_mpm/agents/templates/ruby-engineer.json +0 -280
  289. claude_mpm/agents/templates/rust_engineer.json +0 -275
  290. claude_mpm/agents/templates/security.json +0 -202
  291. claude_mpm/agents/templates/svelte-engineer.json +0 -225
  292. claude_mpm/agents/templates/ticketing.json +0 -177
  293. claude_mpm/agents/templates/typescript_engineer.json +0 -285
  294. claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
  295. claude_mpm/agents/templates/version_control.json +0 -157
  296. claude_mpm/agents/templates/web_qa.json +0 -399
  297. claude_mpm/agents/templates/web_ui.json +0 -189
  298. claude_mpm/commands/mpm-tickets.md +0 -102
  299. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  300. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
  301. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
  302. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
  303. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
  304. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
  305. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  306. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  307. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  308. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  309. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  310. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  311. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  312. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  313. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  314. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  315. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  316. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  317. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  318. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  319. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
  320. claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
  321. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
  322. claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
  323. claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
  324. claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
  325. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
  326. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
  327. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
  328. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
  329. claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
  330. claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
  331. claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
  332. claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
  333. claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
  334. claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
  335. claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
  336. claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
  337. claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
  338. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
  339. claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
  340. claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
  341. claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
  342. claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
  343. claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
  344. claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
  345. claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
  346. claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
  347. claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
  348. claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
  349. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
  350. claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
  351. claude_mpm/dashboard/static/built/connection-manager.js +0 -536
  352. claude_mpm/dashboard/static/built/dashboard.js +0 -2
  353. claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
  354. claude_mpm/dashboard/static/built/react/events.js +0 -30
  355. claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
  356. claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
  357. claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
  358. claude_mpm/dashboard/static/built/shared/logger.js +0 -385
  359. claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
  360. claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
  361. claude_mpm/dashboard/static/built/socket-client.js +0 -2
  362. claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
  363. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  364. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  365. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  366. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  367. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  368. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  369. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  370. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  371. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  372. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  373. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  374. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  375. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  376. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  377. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  378. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  379. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  380. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  381. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  382. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  383. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  384. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  385. claude_mpm/dashboard/static/events.html +0 -607
  386. claude_mpm/dashboard/static/index.html +0 -635
  387. claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
  388. claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
  389. claude_mpm/dashboard/static/js/shared/logger.js +0 -385
  390. claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
  391. claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
  392. claude_mpm/dashboard/static/legacy/activity.html +0 -736
  393. claude_mpm/dashboard/static/legacy/agents.html +0 -786
  394. claude_mpm/dashboard/static/legacy/files.html +0 -747
  395. claude_mpm/dashboard/static/legacy/tools.html +0 -831
  396. claude_mpm/dashboard/static/monitors.html +0 -431
  397. claude_mpm/dashboard/static/production/events.html +0 -659
  398. claude_mpm/dashboard/static/production/main.html +0 -698
  399. claude_mpm/dashboard/static/production/monitors.html +0 -483
  400. claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
  401. claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
  402. claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
  403. claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
  404. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  405. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
  406. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
  407. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
  408. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
  409. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
  410. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
  411. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
  412. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
  413. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
  414. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
  415. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
  416. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
  417. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
  418. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
  419. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
  420. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
  421. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
  422. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
  423. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
  424. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
  425. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
  426. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
  427. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
  428. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
  429. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
  430. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
  431. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
  432. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
  433. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
  434. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
  435. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
  436. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
  437. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
  438. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
  439. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
  440. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
  441. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
  442. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
  443. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
  444. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
  445. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
  446. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
  447. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
  448. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
  449. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
  450. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
  451. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
  452. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
  453. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
  454. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
  455. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
  456. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
  457. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
  458. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
  459. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
  460. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
  461. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
  462. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
  463. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
  464. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
  465. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
  466. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
  467. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
  468. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
  469. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
  470. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
  471. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
  472. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
  473. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
  474. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
  475. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
  476. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
  477. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
  478. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
  479. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
  480. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
  481. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
  482. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
  483. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
  484. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
  485. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
  486. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
  487. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
  488. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
  489. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  490. /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
  491. /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
  492. /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
  493. /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
  494. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
  495. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
  496. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
  497. {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
@@ -1,695 +0,0 @@
1
- # How TDD Prevents Testing Anti-Patterns
2
-
3
- Test-Driven Development (TDD) is not just a testing methodology - it's a design methodology that naturally prevents all five testing anti-patterns. This guide explains the deep connection between TDD and anti-pattern prevention.
4
-
5
- ## Overview
6
-
7
- **Core insight:** If you follow strict TDD, testing anti-patterns become nearly impossible to create.
8
-
9
- **Why:** TDD forces you to think about real behavior before implementation, making mock-testing and test-only methods unnatural.
10
-
11
- ## TDD Fundamentals
12
-
13
- ### The RED/GREEN/REFACTOR Cycle
14
-
15
- ```
16
- 1. RED: Write failing test
17
- - Test doesn't compile or fails
18
- - Verify failure reason is correct
19
- - No implementation exists yet
20
-
21
- 2. GREEN: Write minimal code to pass
22
- - Simplest implementation
23
- - Just enough to pass test
24
- - No gold plating
25
-
26
- 3. REFACTOR: Improve code
27
- - Clean up duplication
28
- - Improve names
29
- - Tests still pass
30
-
31
- 4. REPEAT: Next test
32
- ```
33
-
34
- **Critical rule:** Never write implementation without failing test first.
35
-
36
- See [test-driven-development skill](../../test-driven-development/) for complete workflow.
37
-
38
- ## How TDD Prevents Each Anti-Pattern
39
-
40
- ### Anti-Pattern 1: Testing Mock Behavior
41
-
42
- **How TDD prevents it:**
43
-
44
- ```
45
- TDD Step 1: Write test for real behavior
46
-
47
- Test fails because feature doesn't exist
48
-
49
- TDD Step 2: Implement minimal code
50
-
51
- Test passes - you tested real code, not mock
52
-
53
- If you tested mock:
54
-
55
- Test would pass immediately (mock exists)
56
-
57
- Violation of TDD - didn't see failure
58
- ```
59
-
60
- **Example workflow:**
61
-
62
- ```typescript
63
- // TDD Step 1: Write failing test
64
- test('renders sidebar with navigation', () => {
65
- render(<Page />);
66
- expect(screen.getByRole('navigation')).toBeInTheDocument();
67
- });
68
- // ❌ Fails - Page doesn't render sidebar yet
69
-
70
- // TDD Step 2: Implement
71
- function Page() {
72
- return <div><Sidebar role="navigation" /></div>;
73
- }
74
- // ✅ Passes - tested real component
75
-
76
- // WRONG way (not TDD):
77
- test('renders sidebar mock', () => {
78
- render(<Page />);
79
- expect(screen.getByTestId('sidebar-mock')).toBeInTheDocument();
80
- });
81
- // ✅ Passes immediately - you never saw it fail!
82
- // This violates TDD - test must fail first
83
- ```
84
-
85
- **TDD guarantee:** If test passes immediately, you're testing mock behavior.
86
-
87
- ### Anti-Pattern 2: Test-Only Methods in Production
88
-
89
- **How TDD prevents it:**
90
-
91
- ```
92
- TDD Step 1: Write test for needed behavior
93
-
94
- Test describes what production needs
95
-
96
- TDD Step 2: Minimal implementation
97
-
98
- Only code test needs is written
99
-
100
- If method only for tests:
101
-
102
- No production test would need it
103
-
104
- TDD wouldn't add it
105
- ```
106
-
107
- **Example workflow:**
108
-
109
- ```typescript
110
- // TDD Step 1: Write test for production behavior
111
- test('session expires after timeout', async () => {
112
- const session = new Session();
113
- await advanceTime(SESSION_TIMEOUT);
114
- expect(session.isActive()).toBe(false);
115
- });
116
- // ❌ Fails - Session doesn't handle expiry
117
-
118
- // TDD Step 2: Implement expiry (production feature)
119
- class Session {
120
- isActive() {
121
- return Date.now() < this.expiresAt;
122
- }
123
- }
124
- // ✅ Passes - implemented real behavior
125
-
126
- // WRONG way (not TDD):
127
- // "I need to cleanup in tests"
128
- class Session {
129
- destroy() { /* for tests */ } // ❌ Not driven by test!
130
- }
131
- ```
132
-
133
- **TDD guarantee:** Minimal implementation doesn't add untested code.
134
-
135
- **Test cleanup belongs in test utilities:**
136
- ```typescript
137
- // test-utils/session.ts
138
- export async function cleanupSession(session: Session) {
139
- // Use public API for cleanup
140
- session.logout();
141
- // Clear any test-specific state
142
- }
143
- ```
144
-
145
- ### Anti-Pattern 3: Mocking Without Understanding
146
-
147
- **How TDD prevents it:**
148
-
149
- ```
150
- TDD Step 1: Write test with real implementation
151
-
152
- Test runs - you see what it does
153
-
154
- Identify what's slow/external
155
-
156
- TDD Step 2: Mock at correct level
157
-
158
- Mock only slow part, preserve behavior
159
-
160
- If you mock first:
161
-
162
- Never saw real behavior
163
-
164
- Don't understand dependencies
165
-
166
- Mock breaks test logic
167
- ```
168
-
169
- **Example workflow:**
170
-
171
- ```typescript
172
- // TDD Step 1: Write test with real implementation
173
- test('detects duplicate server', async () => {
174
- await addServer(config);
175
- await expect(addServer(config))
176
- .rejects.toThrow('already exists');
177
- });
178
- // Run test - takes 2 seconds (server startup slow)
179
- // Observe: Config written, duplicate detected
180
- // Understand: Test depends on config persistence
181
-
182
- // TDD Step 2: Mock at correct level
183
- test('detects duplicate server', async () => {
184
- vi.mock('MCPServerManager'); // Mock slow startup only
185
- // Config writing preserved - test logic intact
186
-
187
- await addServer(config);
188
- await expect(addServer(config))
189
- .rejects.toThrow('already exists');
190
- });
191
- // ✅ Fast test, correct behavior
192
-
193
- // WRONG way (not TDD):
194
- // "Let me mock this upfront"
195
- vi.mock('ToolCatalog', () => ({
196
- discoverAndCacheTools: vi.fn() // Breaks test logic!
197
- }));
198
- // Never saw real behavior - don't know what test needs
199
- ```
200
-
201
- **TDD guarantee:** You understand dependencies before mocking them.
202
-
203
- ### Anti-Pattern 4: Incomplete Mocks
204
-
205
- **How TDD prevents it:**
206
-
207
- ```
208
- TDD Step 1: Write test with real API
209
-
210
- See complete response structure
211
-
212
- TDD Step 2: Mock with complete structure
213
-
214
- Test still passes - mock is complete
215
-
216
- If mock incomplete:
217
-
218
- Test fails - mock missing fields
219
-
220
- TDD forces you to complete mock
221
- ```
222
-
223
- **Example workflow:**
224
-
225
- ```typescript
226
- // TDD Step 1: Test with real API (or type)
227
- test('displays user profile', async () => {
228
- const user = await api.getUser('123');
229
- // TypeScript shows complete User type
230
- render(<Profile user={user} />);
231
- expect(screen.getByText(user.name)).toBeInTheDocument();
232
- expect(screen.getByText(user.profile.timezone)).toBeInTheDocument();
233
- });
234
- // Observe complete structure
235
-
236
- // TDD Step 2: Mock with complete structure
237
- test('displays user profile', async () => {
238
- const mockUser: User = { // TypeScript enforces completeness
239
- id: '123',
240
- name: 'Alice',
241
- email: 'alice@example.com',
242
- profile: {
243
- timezone: 'UTC',
244
- locale: 'en-US',
245
- avatar: null
246
- },
247
- metadata: { /* complete */ }
248
- };
249
-
250
- render(<Profile user={mockUser} />);
251
- expect(screen.getByText('Alice')).toBeInTheDocument();
252
- });
253
- // ✅ Complete mock, test passes
254
-
255
- // WRONG way (not TDD):
256
- const mockUser = { id: '123', name: 'Alice' }; // Incomplete
257
- // Later breaks when profile.timezone accessed
258
- ```
259
-
260
- **TDD guarantee:** Test with real data first reveals complete structure.
261
-
262
- **Use TypeScript to enforce completeness:**
263
- ```typescript
264
- // Define complete type from API
265
- interface User {
266
- id: string;
267
- name: string;
268
- email: string;
269
- profile: UserProfile;
270
- metadata: UserMetadata;
271
- }
272
-
273
- // TypeScript errors if incomplete
274
- const mock: User = {
275
- id: '123',
276
- name: 'Alice'
277
- // ❌ TypeScript error - missing fields
278
- };
279
- ```
280
-
281
- ### Anti-Pattern 5: Tests as Afterthought
282
-
283
- **How TDD prevents it:**
284
-
285
- ```
286
- TDD Step 1: MUST write test first
287
-
288
- No implementation without test
289
-
290
- Test IS implementation process
291
-
292
- If implementation first:
293
-
294
- Violated TDD - broke the cycle
295
- ```
296
-
297
- **TDD makes tests as afterthought impossible:**
298
-
299
- ```typescript
300
- // TDD Way - tests ARE implementation
301
- // 1. RED
302
- test('user registration validates email', async () => {
303
- await expect(registerUser('invalid'))
304
- .rejects.toThrow('Invalid email');
305
- });
306
- // ❌ Fails - registerUser doesn't exist
307
-
308
- // 2. GREEN
309
- async function registerUser(email: string) {
310
- if (!isValidEmail(email)) {
311
- throw new Error('Invalid email');
312
- }
313
- // ... registration
314
- }
315
- // ✅ Passes
316
-
317
- // 3. REFACTOR
318
- // Improve validation logic, tests still pass
319
-
320
- // NOT TDD (anti-pattern):
321
- // 1. Implement registerUser
322
- // 2. "Feature complete, need to add tests" ← Afterthought
323
- ```
324
-
325
- **TDD workflow:**
326
- - Tests first = tests are implementation
327
- - No "testing phase" - tests are development
328
- - Feature complete = tests passing
329
- - Can't forget tests - can't write code without them
330
-
331
- ## TDD Workflow Prevents Anti-Patterns
332
-
333
- ### Complete TDD Cycle
334
-
335
- ```typescript
336
- // Feature: User registration with email validation
337
-
338
- // ========================================
339
- // CYCLE 1: Email validation
340
- // ========================================
341
-
342
- // RED: Write failing test
343
- test('rejects invalid email', async () => {
344
- await expect(registerUser('invalid'))
345
- .rejects.toThrow('Invalid email');
346
- });
347
- // ❌ Fails - registerUser doesn't exist
348
-
349
- // GREEN: Minimal implementation
350
- async function registerUser(email: string) {
351
- if (!email.includes('@')) {
352
- throw new Error('Invalid email');
353
- }
354
- }
355
- // ✅ Passes
356
-
357
- // REFACTOR: Improve validation
358
- async function registerUser(email: string) {
359
- if (!isValidEmail(email)) { // Better validator
360
- throw new Error('Invalid email');
361
- }
362
- }
363
- // ✅ Still passes
364
-
365
- // ========================================
366
- // CYCLE 2: Database integration
367
- // ========================================
368
-
369
- // RED: Write failing test
370
- test('saves user to database', async () => {
371
- const user = await registerUser('alice@example.com');
372
- const saved = await db.users.findById(user.id);
373
- expect(saved.email).toBe('alice@example.com');
374
- });
375
- // ❌ Fails - no database integration
376
-
377
- // GREEN: Add database
378
- async function registerUser(email: string) {
379
- if (!isValidEmail(email)) {
380
- throw new Error('Invalid email');
381
- }
382
- const user = await db.users.create({ email }); // Added
383
- return user;
384
- }
385
- // ✅ Passes
386
-
387
- // REFACTOR: Extract repository pattern
388
- // Tests still pass
389
-
390
- // ========================================
391
- // CYCLE 3: Duplicate prevention
392
- // ========================================
393
-
394
- // RED: Write failing test
395
- test('prevents duplicate email', async () => {
396
- await registerUser('alice@example.com');
397
- await expect(registerUser('alice@example.com'))
398
- .rejects.toThrow('Email already exists');
399
- });
400
- // ❌ Fails - no duplicate check
401
-
402
- // GREEN: Add check
403
- async function registerUser(email: string) {
404
- if (!isValidEmail(email)) {
405
- throw new Error('Invalid email');
406
- }
407
- const existing = await db.users.findByEmail(email);
408
- if (existing) {
409
- throw new Error('Email already exists'); // Added
410
- }
411
- return await db.users.create({ email });
412
- }
413
- // ✅ Passes
414
-
415
- // REFACTOR: Improve error handling
416
- // Tests still pass
417
- ```
418
-
419
- **Notice:**
420
- - ✅ No mock behavior testing - real code tested
421
- - ✅ No test-only methods - only what tests needed
422
- - ✅ No uninformed mocking - saw real behavior first
423
- - ✅ No incomplete mocks - used real structures
424
- - ✅ No afterthought tests - tests first always
425
-
426
- ## TDD Mindset: Test-First Thinking
427
-
428
- ### Mental Model
429
-
430
- **NOT TDD thinking:**
431
- ```
432
- "How do I implement this feature?"
433
-
434
- Implement code
435
-
436
- "How do I test this?"
437
-
438
- Write tests
439
-
440
- Anti-patterns emerge
441
- ```
442
-
443
- **TDD thinking:**
444
- ```
445
- "How will I verify this works?"
446
-
447
- Write test
448
-
449
- "What's minimal code to pass?"
450
-
451
- Implement
452
-
453
- Anti-patterns prevented
454
- ```
455
-
456
- ### Test-First Benefits
457
-
458
- **Design benefits:**
459
- - API designed from consumer perspective
460
- - Testable code (loose coupling)
461
- - Clear interfaces
462
- - Minimal implementation
463
-
464
- **Quality benefits:**
465
- - Verified behavior
466
- - Edge cases caught early
467
- - Regression prevention
468
- - Living documentation
469
-
470
- **Anti-pattern prevention:**
471
- - Can't test mocks (test fails first against real code)
472
- - No test-only methods (minimal implementation)
473
- - Must understand dependencies (see real behavior)
474
- - Complete structures (test with real data first)
475
- - Tests ARE implementation (not afterthought)
476
-
477
- ## When TDD is Violated
478
-
479
- **Signs you're not following TDD:**
480
-
481
- ```
482
- 🚩 Writing implementation before test
483
- 🚩 Test passes immediately
484
- 🚩 Skipping "watch it fail" step
485
- 🚩 Mocking before running test
486
- 🚩 "Implementation done, adding tests"
487
- ```
488
-
489
- **Consequences:**
490
- - All five anti-patterns become possible
491
- - Test quality degrades
492
- - False confidence
493
- - Design issues
494
-
495
- **Recovery:**
496
- 1. Stop adding features
497
- 2. Return to TDD workflow
498
- 3. Write test first for next feature
499
- 4. Watch it fail
500
- 5. Minimal implementation
501
- 6. Maintain discipline
502
-
503
- ## TDD and Mocking Strategy
504
-
505
- ### TDD-Compliant Mocking
506
-
507
- **The right way:**
508
-
509
- ```typescript
510
- // 1. Write test with real implementation
511
- test('user registration sends welcome email', async () => {
512
- await registerUser('alice@example.com');
513
- // Observe: Email sending is slow (2 seconds)
514
- });
515
-
516
- // 2. Identify slow operation
517
- // emailService.send() is slow (network call)
518
-
519
- // 3. Mock at correct level
520
- test('user registration sends welcome email', async () => {
521
- vi.spyOn(emailService, 'send').mockResolvedValue();
522
-
523
- await registerUser('alice@example.com');
524
-
525
- expect(emailService.send).toHaveBeenCalledWith({
526
- to: 'alice@example.com',
527
- subject: 'Welcome'
528
- });
529
- });
530
- // Test runs fast, verifies email logic
531
- ```
532
-
533
- **TDD mocking principles:**
534
-
535
- 1. **Run with real implementation first** - See actual behavior
536
- 2. **Measure performance** - Mock only if slow
537
- 3. **Mock at boundaries** - I/O, network, filesystem
538
- 4. **Preserve business logic** - Don't mock what you're testing
539
- 5. **Verify behavior, not mocks** - Test results, not mock calls
540
-
541
- ### Mocking Levels in TDD
542
-
543
- ```
544
- Layer 1: Business Logic
545
- → NEVER mock (this is what you're testing)
546
-
547
- Layer 2: Application Services
548
- → RARELY mock (needed for assertions)
549
-
550
- Layer 3: Adapters
551
- → SOMETIMES mock (if slow)
552
-
553
- Layer 4: External I/O
554
- → USUALLY mock (network, DB, filesystem)
555
-
556
- Layer 5: Infrastructure
557
- → ALWAYS mock in unit tests (servers, APIs)
558
- ```
559
-
560
- ## Common TDD Mistakes
561
-
562
- ### Mistake 1: Not Watching Test Fail
563
-
564
- ```typescript
565
- // ❌ WRONG
566
- test('feature works', () => {
567
- expect(true).toBe(true); // Passes immediately
568
- });
569
- // Didn't verify test tests right thing
570
-
571
- // ✅ RIGHT
572
- test('validates email', async () => {
573
- await expect(register('invalid'))
574
- .rejects.toThrow('Invalid email');
575
- });
576
- // ❌ Fails first - register doesn't exist
577
- // Then implement
578
- // ✅ Passes - verified test works
579
- ```
580
-
581
- ### Mistake 2: Overly Complex Implementation
582
-
583
- ```typescript
584
- // ❌ WRONG (not minimal)
585
- test('adds numbers', () => {
586
- expect(add(2, 3)).toBe(5);
587
- });
588
-
589
- function add(a: number, b: number): number {
590
- // Not minimal - over-engineered
591
- return Array(b).fill(a).reduce((sum, n) => sum + n, 0);
592
- }
593
-
594
- // ✅ RIGHT (minimal)
595
- function add(a: number, b: number): number {
596
- return a + b; // Simplest solution
597
- }
598
- ```
599
-
600
- ### Mistake 3: Testing Implementation Details
601
-
602
- ```typescript
603
- // ❌ WRONG
604
- test('uses cache', () => {
605
- const cache = new Cache();
606
- service.setCache(cache); // Testing how it works
607
- expect(service.cache).toBe(cache);
608
- });
609
-
610
- // ✅ RIGHT
611
- test('returns cached result', () => {
612
- service.get('key');
613
- service.get('key');
614
- expect(slowOperation).toHaveBeenCalledOnce(); // Testing behavior
615
- });
616
- ```
617
-
618
- ## TDD Discipline
619
-
620
- ### Maintaining TDD Practice
621
-
622
- **Commit to:**
623
- - Test first, always
624
- - Watch it fail, every time
625
- - Minimal implementation, no gold plating
626
- - Refactor with confidence
627
-
628
- **When tempted to skip TDD:**
629
- - "Just a small change" → Write test first
630
- - "I know it works" → Write test to prove it
631
- - "This is hard to test" → Design issue, fix it
632
- - "Tests can wait" → No, they can't
633
-
634
- **TDD is not optional:**
635
- - Not a suggestion
636
- - Not for later
637
- - Not just for new features
638
- - Not "when I have time"
639
-
640
- **TDD is how you write code.**
641
-
642
- ## Integration with Other Skills
643
-
644
- **Prerequisite skills:**
645
- - [test-driven-development](../../test-driven-development/) - Complete TDD workflow
646
-
647
- **Complementary skills:**
648
- - [verification-before-completion](../../../productivity/verification-before-completion/) - Definition of "done"
649
-
650
- **Anti-pattern prevention:**
651
- - This skill - What TDD prevents
652
-
653
- ## Summary: TDD as Anti-Pattern Prevention
654
-
655
- | Anti-Pattern | TDD Prevention Mechanism |
656
- |--------------|---------------------------|
657
- | Testing Mock Behavior | Must watch test fail against real code first |
658
- | Test-Only Methods | Minimal implementation doesn't add them |
659
- | Mocking Without Understanding | Run with real impl first, understand dependencies |
660
- | Incomplete Mocks | Test with real data first, see complete structure |
661
- | Tests as Afterthought | Tests first is the workflow, impossible to skip |
662
-
663
- **The bottom line:** Strict TDD adherence makes testing anti-patterns nearly impossible to create.
664
-
665
- If you find yourself with these anti-patterns, you've violated TDD. Return to the RED/GREEN/REFACTOR cycle.
666
-
667
- ## Quick Reference
668
-
669
- **TDD Cycle:**
670
- ```
671
- RED → Write failing test
672
- GREEN → Minimal implementation
673
- REFACTOR → Improve code
674
- REPEAT → Next test
675
- ```
676
-
677
- **Anti-pattern prevention:**
678
- ```
679
- Test first → Prevents afterthought
680
- Watch fail → Prevents mock testing
681
- Minimal code → Prevents test-only methods
682
- Real impl first → Prevents uninformed mocking
683
- Real data first → Prevents incomplete mocks
684
- ```
685
-
686
- **TDD discipline:**
687
- ```
688
- Always test first
689
- Always watch fail
690
- Always minimal implementation
691
- Always refactor
692
- Never skip the cycle
693
- ```
694
-
695
- See [test-driven-development skill](../../test-driven-development/) for complete TDD workflow and examples.