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

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