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,639 +0,0 @@
1
- # Complete TDD Workflow
2
-
3
- > **Part of**: [Test-Driven Development](../SKILL.md)
4
- > **Category**: testing
5
- > **Reading Level**: Intermediate
6
-
7
- ## Purpose
8
-
9
- Complete step-by-step workflow for the RED/GREEN/REFACTOR cycle, with detailed instructions, examples, and verification criteria for each phase.
10
-
11
- ## The Complete Cycle
12
-
13
- ```
14
- ┌──────────────────────────────────────────────────────┐
15
- │ TDD CYCLE │
16
- ├──────────────────────────────────────────────────────┤
17
- │ │
18
- │ RED: Write Failing Test │
19
- │ ↓ │
20
- │ VERIFY RED: Watch it fail correctly │
21
- │ ↓ │
22
- │ GREEN: Minimal implementation │
23
- │ ↓ │
24
- │ VERIFY GREEN: Watch it pass │
25
- │ ↓ │
26
- │ REFACTOR: Improve code (optional) │
27
- │ ↓ │
28
- │ REPEAT: Next test for next feature │
29
- │ │
30
- └──────────────────────────────────────────────────────┘
31
- ```
32
-
33
- ## Phase 1: RED - Write Failing Test
34
-
35
- ### Goal
36
- Create one minimal test that describes desired behavior.
37
-
38
- ### Steps
39
-
40
- **1. Identify Single Behavior**
41
- ```
42
- Ask: What is ONE thing this code should do?
43
- Not: "Handle user authentication and authorization and validation"
44
- But: "Validate email format"
45
- ```
46
-
47
- **2. Write Clear Test Name**
48
- ```typescript
49
- // Good: Describes behavior
50
- test('rejects email without @ symbol', () => {})
51
- test('accepts valid email format', () => {})
52
- test('trims whitespace from email', () => {})
53
-
54
- // Bad: Vague or implementation-focused
55
- test('test1', () => {})
56
- test('email validation works', () => {})
57
- test('uses regex pattern', () => {})
58
- ```
59
-
60
- **3. Write Test Body**
61
-
62
- **Structure:**
63
- ```typescript
64
- test('behavior description', () => {
65
- // Arrange: Set up test data
66
- const input = 'test data';
67
-
68
- // Act: Call the function
69
- const result = functionUnderTest(input);
70
-
71
- // Assert: Verify behavior
72
- expect(result).toBe(expected);
73
- });
74
- ```
75
-
76
- **Good Example:**
77
- ```typescript
78
- test('retries failed operations 3 times', async () => {
79
- let attempts = 0;
80
- const operation = () => {
81
- attempts++;
82
- if (attempts < 3) throw new Error('fail');
83
- return 'success';
84
- };
85
-
86
- const result = await retryOperation(operation);
87
-
88
- expect(result).toBe('success');
89
- expect(attempts).toBe(3);
90
- });
91
- ```
92
-
93
- **Bad Example:**
94
- ```typescript
95
- test('retry works', async () => {
96
- const mock = jest.fn()
97
- .mockRejectedValueOnce(new Error())
98
- .mockRejectedValueOnce(new Error())
99
- .mockResolvedValueOnce('success');
100
- await retryOperation(mock);
101
- expect(mock).toHaveBeenCalledTimes(3);
102
- });
103
- // Problem: Tests mock behavior, not real code
104
- ```
105
-
106
- ### Test Quality Checklist
107
-
108
- - [ ] Tests ONE behavior
109
- - [ ] Name clearly describes what should happen
110
- - [ ] Uses real code (mocks only if unavoidable)
111
- - [ ] Arrange/Act/Assert structure clear
112
- - [ ] Easy to understand what's being tested
113
-
114
- ## Phase 2: VERIFY RED - Watch It Fail
115
-
116
- ### Goal
117
- Confirm test fails for the RIGHT reason.
118
-
119
- ### Steps
120
-
121
- **1. Run Test**
122
- ```bash
123
- # Run specific test file
124
- npm test path/to/test.test.ts
125
-
126
- # Or run single test
127
- npm test -- -t "behavior description"
128
- ```
129
-
130
- **2. Verify Failure Type**
131
-
132
- **✓ Good Failure (Feature Missing):**
133
- ```
134
- FAIL: retries failed operations 3 times
135
- ReferenceError: retryOperation is not defined
136
-
137
- Expected: 'success'
138
- Received: undefined
139
- ```
140
-
141
- **✗ Bad Failure (Test Error):**
142
- ```
143
- FAIL: retries failed operations 3 times
144
- SyntaxError: Unexpected token
145
- TypeError: Cannot read property 'x' of undefined
146
- ```
147
-
148
- **✗ Bad Outcome (Test Passes):**
149
- ```
150
- PASS: retries failed operations 3 times
151
- ```
152
- → You're testing existing behavior, not new feature
153
-
154
- ### What to Check
155
-
156
- | Outcome | Meaning | Action |
157
- |---------|---------|--------|
158
- | Test fails with "not defined" | ✓ Good - feature missing | Proceed to GREEN |
159
- | Test fails with "Expected X, got Y" | ✓ Good - behavior wrong | Proceed to GREEN |
160
- | Test errors (syntax, type) | ✗ Fix test | Fix error, rerun VERIFY RED |
161
- | Test passes | ✗ Testing existing behavior | Rewrite test for NEW behavior |
162
-
163
- ### Common Issues
164
-
165
- **Issue: Test Passes Immediately**
166
-
167
- ```typescript
168
- // Problem: Testing existing code
169
- test('processes array', () => {
170
- const result = processArray([1, 2, 3]);
171
- expect(result).toBeDefined(); // Already works!
172
- });
173
-
174
- // Fix: Test NEW behavior
175
- test('processes empty array', () => {
176
- const result = processArray([]);
177
- expect(result).toEqual([]); // Currently fails
178
- });
179
- ```
180
-
181
- **Issue: Test Errors Instead of Failing**
182
-
183
- ```typescript
184
- // Problem: Typo in test
185
- test('validates email', () => {
186
- const result = validateEmial('test@example.com'); // Typo
187
- expect(result).toBe(true);
188
- });
189
-
190
- // Fix: Correct typo, rerun
191
- test('validates email', () => {
192
- const result = validateEmail('test@example.com');
193
- expect(result).toBe(true);
194
- });
195
- ```
196
-
197
- ## Phase 3: GREEN - Minimal Implementation
198
-
199
- ### Goal
200
- Write simplest code to make test pass.
201
-
202
- ### Steps
203
-
204
- **1. Write Minimal Code**
205
-
206
- **Good (Minimal):**
207
- ```typescript
208
- async function retryOperation<T>(fn: () => Promise<T>): Promise<T> {
209
- for (let i = 0; i < 3; i++) {
210
- try {
211
- return await fn();
212
- } catch (e) {
213
- if (i === 2) throw e;
214
- }
215
- }
216
- throw new Error('unreachable');
217
- }
218
- ```
219
-
220
- **Bad (Over-engineered):**
221
- ```typescript
222
- async function retryOperation<T>(
223
- fn: () => Promise<T>,
224
- options?: {
225
- maxRetries?: number;
226
- backoff?: 'linear' | 'exponential';
227
- onRetry?: (attempt: number) => void;
228
- timeout?: number;
229
- }
230
- ): Promise<T> {
231
- // YAGNI - You Aren't Gonna Need It
232
- }
233
- ```
234
-
235
- **2. Resist Temptations**
236
-
237
- **DON'T:**
238
- - Add features not tested
239
- - Refactor other code
240
- - "Improve" beyond test requirements
241
- - Add configuration options "for flexibility"
242
- - Handle edge cases not in test
243
-
244
- **DO:**
245
- - Write exactly enough to pass test
246
- - Keep it simple
247
- - Save improvements for REFACTOR phase
248
- - Trust that next test will drive next feature
249
-
250
- ### Implementation Patterns
251
-
252
- **Pattern: Hardcode First**
253
-
254
- ```typescript
255
- // Test: User can login with valid credentials
256
- test('logs in with valid credentials', async () => {
257
- const result = await login('user@example.com', 'password123');
258
- expect(result.success).toBe(true);
259
- });
260
-
261
- // First implementation: Hardcode it
262
- function login(email: string, password: string) {
263
- return { success: true }; // Simplest thing that passes
264
- }
265
-
266
- // Next test will force real implementation
267
- test('rejects invalid credentials', async () => {
268
- const result = await login('user@example.com', 'wrongpass');
269
- expect(result.success).toBe(false);
270
- });
271
-
272
- // Now implement for real
273
- function login(email: string, password: string) {
274
- const valid = checkCredentials(email, password);
275
- return { success: valid };
276
- }
277
- ```
278
-
279
- **Pattern: Fake It Then Make It**
280
-
281
- ```typescript
282
- // Iteration 1: Fake it
283
- function calculateTotal(items: Item[]) {
284
- return 100; // Hardcoded to pass first test
285
- }
286
-
287
- // Iteration 2: Make it real
288
- function calculateTotal(items: Item[]) {
289
- return items.reduce((sum, item) => sum + item.price, 0);
290
- }
291
- ```
292
-
293
- ## Phase 4: VERIFY GREEN - Watch It Pass
294
-
295
- ### Goal
296
- Confirm test passes and nothing broke.
297
-
298
- ### Steps
299
-
300
- **1. Run Test**
301
- ```bash
302
- npm test path/to/test.test.ts
303
- ```
304
-
305
- **2. Verify Success**
306
-
307
- **✓ Good:**
308
- ```
309
- PASS: retries failed operations 3 times
310
- ```
311
-
312
- **✗ Bad (Still Failing):**
313
- ```
314
- FAIL: retries failed operations 3 times
315
- ```
316
- → Fix implementation, don't change test
317
-
318
- **✗ Bad (New Test Passes, Old Tests Fail):**
319
- ```
320
- PASS: retries failed operations 3 times
321
- FAIL: handles immediate success
322
- ```
323
- → Fix regression immediately
324
-
325
- **3. Run Full Test Suite**
326
- ```bash
327
- # Run ALL tests
328
- npm test
329
-
330
- # Verify output
331
- All tests passed? → Proceed to REFACTOR
332
- Some tests failed? → Fix regressions before continuing
333
- ```
334
-
335
- ### What to Check
336
-
337
- - [ ] New test passes
338
- - [ ] All existing tests pass
339
- - [ ] No warnings in output
340
- - [ ] No console errors
341
- - [ ] Build succeeds
342
-
343
- ### Common Issues
344
-
345
- **Issue: Test Still Fails**
346
-
347
- ```typescript
348
- // Test expects 3 retries
349
- expect(attempts).toBe(3);
350
-
351
- // But implementation only does 2
352
- for (let i = 0; i < 2; i++) {
353
- // Fix: Change to 3
354
- }
355
- ```
356
-
357
- **Issue: Other Tests Break**
358
-
359
- ```typescript
360
- // New code breaks existing functionality
361
- function processArray(arr: number[]) {
362
- return arr.map(x => x * 2); // Breaks test expecting sum
363
- }
364
-
365
- // Fix implementation to satisfy both tests
366
- function processArray(arr: number[], operation: 'sum' | 'double') {
367
- if (operation === 'sum') return arr.reduce((a, b) => a + b);
368
- return arr.map(x => x * 2);
369
- }
370
- ```
371
-
372
- ## Phase 5: REFACTOR - Improve Code
373
-
374
- ### Goal
375
- Clean up code while keeping tests green.
376
-
377
- ### When to Refactor
378
-
379
- **Do refactor when:**
380
- - Code is duplicated
381
- - Names are unclear
382
- - Logic is complex
383
- - Structure is messy
384
-
385
- **Don't refactor when:**
386
- - Tests are red
387
- - Adding new behavior
388
- - Time pressure (do it next cycle)
389
-
390
- ### Refactoring Steps
391
-
392
- **1. Identify Improvements**
393
-
394
- ```typescript
395
- // Before: Duplication
396
- function validateEmail(email: string) {
397
- if (!email.includes('@')) return false;
398
- if (email.indexOf('@') !== email.lastIndexOf('@')) return false;
399
- return true;
400
- }
401
-
402
- function validateUsername(username: string) {
403
- if (username.length < 3) return false;
404
- if (username.length > 20) return false;
405
- return true;
406
- }
407
-
408
- // After: Extract common pattern
409
- function validateLength(str: string, min: number, max: number) {
410
- return str.length >= min && str.length <= max;
411
- }
412
-
413
- function validateEmail(email: string) {
414
- return email.includes('@') &&
415
- email.indexOf('@') === email.lastIndexOf('@');
416
- }
417
-
418
- function validateUsername(username: string) {
419
- return validateLength(username, 3, 20);
420
- }
421
- ```
422
-
423
- **2. Refactor Incrementally**
424
-
425
- ```
426
- Make ONE change → Run tests → Green? → Next change
427
- ```
428
-
429
- **DON'T:** Make multiple changes then run tests
430
- **DO:** Change → Test → Change → Test
431
-
432
- **3. Keep Tests Green**
433
-
434
- If tests turn red during refactoring:
435
- - STOP
436
- - Revert change
437
- - Try smaller change
438
- - Keep tests green at all times
439
-
440
- ### Common Refactorings
441
-
442
- **Extract Method:**
443
- ```typescript
444
- // Before
445
- function processUser(user: User) {
446
- const valid = user.email.includes('@') &&
447
- user.age >= 18 &&
448
- user.name.length > 0;
449
- if (!valid) throw new Error('Invalid');
450
- // ...
451
- }
452
-
453
- // After
454
- function validateUser(user: User): boolean {
455
- return user.email.includes('@') &&
456
- user.age >= 18 &&
457
- user.name.length > 0;
458
- }
459
-
460
- function processUser(user: User) {
461
- if (!validateUser(user)) throw new Error('Invalid');
462
- // ...
463
- }
464
- ```
465
-
466
- **Rename for Clarity:**
467
- ```typescript
468
- // Before
469
- function proc(d: any) {
470
- const x = d.a * d.b;
471
- return x;
472
- }
473
-
474
- // After
475
- function calculateArea(dimensions: Dimensions) {
476
- const area = dimensions.width * dimensions.height;
477
- return area;
478
- }
479
- ```
480
-
481
- ## Phase 6: REPEAT - Next Test
482
-
483
- ### Goal
484
- Continue cycle for next behavior.
485
-
486
- ### Steps
487
-
488
- **1. Identify Next Behavior**
489
-
490
- ```
491
- Current: Validates email format
492
- Next: Validates password strength
493
- Future: Checks username availability
494
- ```
495
-
496
- **2. Start New Cycle**
497
-
498
- Return to Phase 1 (RED) with new test:
499
-
500
- ```typescript
501
- test('rejects weak passwords', () => {
502
- const result = validatePassword('123');
503
- expect(result.valid).toBe(false);
504
- expect(result.error).toBe('Password too short');
505
- });
506
- ```
507
-
508
- **3. Small Increments**
509
-
510
- Each test should be small step:
511
- - ✓ Add email validation
512
- - ✓ Add password validation
513
- - ✓ Add username validation
514
-
515
- Not:
516
- - ✗ Add complete user registration system
517
-
518
- ## Complete Example: Building Retry Function
519
-
520
- ### Iteration 1: Basic Retry
521
-
522
- **RED:**
523
- ```typescript
524
- test('retries failed operation once', async () => {
525
- let attempts = 0;
526
- const operation = () => {
527
- attempts++;
528
- if (attempts < 2) throw new Error('fail');
529
- return 'success';
530
- };
531
-
532
- const result = await retryOperation(operation);
533
- expect(attempts).toBe(2);
534
- });
535
- ```
536
-
537
- **GREEN:**
538
- ```typescript
539
- async function retryOperation<T>(fn: () => Promise<T>): Promise<T> {
540
- try {
541
- return await fn();
542
- } catch (e) {
543
- return await fn(); // Retry once
544
- }
545
- }
546
- ```
547
-
548
- ### Iteration 2: Multiple Retries
549
-
550
- **RED:**
551
- ```typescript
552
- test('retries failed operation 3 times', async () => {
553
- let attempts = 0;
554
- const operation = () => {
555
- attempts++;
556
- if (attempts < 3) throw new Error('fail');
557
- return 'success';
558
- };
559
-
560
- const result = await retryOperation(operation);
561
- expect(attempts).toBe(3);
562
- });
563
- ```
564
-
565
- **GREEN:**
566
- ```typescript
567
- async function retryOperation<T>(fn: () => Promise<T>): Promise<T> {
568
- for (let i = 0; i < 3; i++) {
569
- try {
570
- return await fn();
571
- } catch (e) {
572
- if (i === 2) throw e;
573
- }
574
- }
575
- throw new Error('unreachable');
576
- }
577
- ```
578
-
579
- ### Iteration 3: Handle Final Failure
580
-
581
- **RED:**
582
- ```typescript
583
- test('throws error after all retries exhausted', async () => {
584
- const operation = () => {
585
- throw new Error('persistent failure');
586
- };
587
-
588
- await expect(retryOperation(operation)).rejects.toThrow('persistent failure');
589
- });
590
- ```
591
-
592
- **GREEN:**
593
- ```typescript
594
- // Already passes! Implementation handles this.
595
- ```
596
-
597
- **REFACTOR:**
598
- ```typescript
599
- async function retryOperation<T>(
600
- fn: () => Promise<T>,
601
- maxRetries: number = 3
602
- ): Promise<T> {
603
- let lastError: Error;
604
-
605
- for (let attempt = 0; attempt < maxRetries; attempt++) {
606
- try {
607
- return await fn();
608
- } catch (error) {
609
- lastError = error as Error;
610
- }
611
- }
612
-
613
- throw lastError!;
614
- }
615
- ```
616
-
617
- ## Summary
618
-
619
- **The Cycle:**
620
- 1. RED: Write failing test
621
- 2. VERIFY RED: Watch it fail correctly
622
- 3. GREEN: Minimal implementation
623
- 4. VERIFY GREEN: Watch it pass
624
- 5. REFACTOR: Improve code
625
- 6. REPEAT: Next behavior
626
-
627
- **Key Points:**
628
- - Each phase is mandatory
629
- - Watch tests run (don't skip verification)
630
- - Keep implementations minimal
631
- - Refactor only when green
632
- - Small increments, one behavior at a time
633
-
634
- ## Related References
635
-
636
- - [Examples](examples.md): Real-world TDD scenarios
637
- - [Philosophy](philosophy.md): Why order matters
638
- - [Anti-patterns](anti-patterns.md): Common mistakes
639
- - [Integration](integration.md): TDD with other skills