claude-mpm 5.4.22__py3-none-any.whl → 5.6.34__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (487) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_AGENT.md +164 -0
  3. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  4. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
  5. claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
  6. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +109 -1925
  7. claude_mpm/agents/MEMORY.md +1 -1
  8. claude_mpm/agents/PM_INSTRUCTIONS.md +374 -1257
  9. claude_mpm/agents/WORKFLOW.md +6 -253
  10. claude_mpm/agents/agent_loader.py +1 -1
  11. claude_mpm/agents/base_agent.json +31 -0
  12. claude_mpm/agents/frontmatter_validator.py +2 -2
  13. claude_mpm/agents/templates/circuit-breakers.md +26 -17
  14. claude_mpm/cli/__init__.py +5 -1
  15. claude_mpm/cli/commands/agent_state_manager.py +10 -10
  16. claude_mpm/cli/commands/agents.py +11 -13
  17. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  18. claude_mpm/cli/commands/auto_configure.py +4 -4
  19. claude_mpm/cli/commands/autotodos.py +566 -0
  20. claude_mpm/cli/commands/commander.py +216 -0
  21. claude_mpm/cli/commands/configure.py +621 -22
  22. claude_mpm/cli/commands/configure_agent_display.py +12 -0
  23. claude_mpm/cli/commands/hook_errors.py +60 -60
  24. claude_mpm/cli/commands/monitor.py +2 -2
  25. claude_mpm/cli/commands/mpm_init/core.py +72 -0
  26. claude_mpm/cli/commands/postmortem.py +1 -1
  27. claude_mpm/cli/commands/profile.py +276 -0
  28. claude_mpm/cli/commands/run.py +35 -3
  29. claude_mpm/cli/commands/skill_source.py +51 -2
  30. claude_mpm/cli/commands/skills.py +182 -32
  31. claude_mpm/cli/executor.py +130 -16
  32. claude_mpm/cli/interactive/__init__.py +10 -0
  33. claude_mpm/cli/interactive/agent_wizard.py +32 -52
  34. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  35. claude_mpm/cli/interactive/skill_selector.py +481 -0
  36. claude_mpm/cli/parsers/base_parser.py +83 -1
  37. claude_mpm/cli/parsers/commander_parser.py +116 -0
  38. claude_mpm/cli/parsers/profile_parser.py +147 -0
  39. claude_mpm/cli/parsers/run_parser.py +10 -0
  40. claude_mpm/cli/parsers/skill_source_parser.py +4 -0
  41. claude_mpm/cli/parsers/skills_parser.py +2 -3
  42. claude_mpm/cli/startup.py +690 -386
  43. claude_mpm/cli/startup_display.py +74 -6
  44. claude_mpm/cli/startup_logging.py +2 -2
  45. claude_mpm/cli/utils.py +7 -3
  46. claude_mpm/commander/__init__.py +78 -0
  47. claude_mpm/commander/adapters/__init__.py +60 -0
  48. claude_mpm/commander/adapters/auggie.py +260 -0
  49. claude_mpm/commander/adapters/base.py +288 -0
  50. claude_mpm/commander/adapters/claude_code.py +392 -0
  51. claude_mpm/commander/adapters/codex.py +237 -0
  52. claude_mpm/commander/adapters/communication.py +366 -0
  53. claude_mpm/commander/adapters/example_usage.py +310 -0
  54. claude_mpm/commander/adapters/mpm.py +389 -0
  55. claude_mpm/commander/adapters/registry.py +204 -0
  56. claude_mpm/commander/api/__init__.py +16 -0
  57. claude_mpm/commander/api/app.py +121 -0
  58. claude_mpm/commander/api/errors.py +133 -0
  59. claude_mpm/commander/api/routes/__init__.py +8 -0
  60. claude_mpm/commander/api/routes/events.py +184 -0
  61. claude_mpm/commander/api/routes/inbox.py +171 -0
  62. claude_mpm/commander/api/routes/messages.py +148 -0
  63. claude_mpm/commander/api/routes/projects.py +271 -0
  64. claude_mpm/commander/api/routes/sessions.py +226 -0
  65. claude_mpm/commander/api/routes/work.py +296 -0
  66. claude_mpm/commander/api/schemas.py +186 -0
  67. claude_mpm/commander/chat/__init__.py +7 -0
  68. claude_mpm/commander/chat/cli.py +146 -0
  69. claude_mpm/commander/chat/commands.py +96 -0
  70. claude_mpm/commander/chat/repl.py +310 -0
  71. claude_mpm/commander/config.py +51 -0
  72. claude_mpm/commander/config_loader.py +115 -0
  73. claude_mpm/commander/core/__init__.py +10 -0
  74. claude_mpm/commander/core/block_manager.py +325 -0
  75. claude_mpm/commander/core/response_manager.py +323 -0
  76. claude_mpm/commander/daemon.py +603 -0
  77. claude_mpm/commander/env_loader.py +59 -0
  78. claude_mpm/commander/events/__init__.py +26 -0
  79. claude_mpm/commander/events/manager.py +332 -0
  80. claude_mpm/commander/frameworks/__init__.py +12 -0
  81. claude_mpm/commander/frameworks/base.py +146 -0
  82. claude_mpm/commander/frameworks/claude_code.py +58 -0
  83. claude_mpm/commander/frameworks/mpm.py +62 -0
  84. claude_mpm/commander/inbox/__init__.py +16 -0
  85. claude_mpm/commander/inbox/dedup.py +128 -0
  86. claude_mpm/commander/inbox/inbox.py +224 -0
  87. claude_mpm/commander/inbox/models.py +70 -0
  88. claude_mpm/commander/instance_manager.py +450 -0
  89. claude_mpm/commander/llm/__init__.py +6 -0
  90. claude_mpm/commander/llm/openrouter_client.py +167 -0
  91. claude_mpm/commander/llm/summarizer.py +70 -0
  92. claude_mpm/commander/memory/__init__.py +45 -0
  93. claude_mpm/commander/memory/compression.py +347 -0
  94. claude_mpm/commander/memory/embeddings.py +230 -0
  95. claude_mpm/commander/memory/entities.py +310 -0
  96. claude_mpm/commander/memory/example_usage.py +290 -0
  97. claude_mpm/commander/memory/integration.py +325 -0
  98. claude_mpm/commander/memory/search.py +381 -0
  99. claude_mpm/commander/memory/store.py +657 -0
  100. claude_mpm/commander/models/__init__.py +18 -0
  101. claude_mpm/commander/models/events.py +121 -0
  102. claude_mpm/commander/models/project.py +162 -0
  103. claude_mpm/commander/models/work.py +214 -0
  104. claude_mpm/commander/parsing/__init__.py +20 -0
  105. claude_mpm/commander/parsing/extractor.py +132 -0
  106. claude_mpm/commander/parsing/output_parser.py +270 -0
  107. claude_mpm/commander/parsing/patterns.py +100 -0
  108. claude_mpm/commander/persistence/__init__.py +11 -0
  109. claude_mpm/commander/persistence/event_store.py +274 -0
  110. claude_mpm/commander/persistence/state_store.py +309 -0
  111. claude_mpm/commander/persistence/work_store.py +164 -0
  112. claude_mpm/commander/polling/__init__.py +13 -0
  113. claude_mpm/commander/polling/event_detector.py +104 -0
  114. claude_mpm/commander/polling/output_buffer.py +49 -0
  115. claude_mpm/commander/polling/output_poller.py +153 -0
  116. claude_mpm/commander/project_session.py +268 -0
  117. claude_mpm/commander/proxy/__init__.py +12 -0
  118. claude_mpm/commander/proxy/formatter.py +89 -0
  119. claude_mpm/commander/proxy/output_handler.py +191 -0
  120. claude_mpm/commander/proxy/relay.py +155 -0
  121. claude_mpm/commander/registry.py +410 -0
  122. claude_mpm/commander/runtime/__init__.py +10 -0
  123. claude_mpm/commander/runtime/executor.py +191 -0
  124. claude_mpm/commander/runtime/monitor.py +346 -0
  125. claude_mpm/commander/session/__init__.py +6 -0
  126. claude_mpm/commander/session/context.py +81 -0
  127. claude_mpm/commander/session/manager.py +59 -0
  128. claude_mpm/commander/tmux_orchestrator.py +361 -0
  129. claude_mpm/commander/web/__init__.py +1 -0
  130. claude_mpm/commander/work/__init__.py +30 -0
  131. claude_mpm/commander/work/executor.py +207 -0
  132. claude_mpm/commander/work/queue.py +405 -0
  133. claude_mpm/commander/workflow/__init__.py +27 -0
  134. claude_mpm/commander/workflow/event_handler.py +241 -0
  135. claude_mpm/commander/workflow/notifier.py +146 -0
  136. claude_mpm/commands/mpm-config.md +20 -249
  137. claude_mpm/commands/mpm-doctor.md +16 -21
  138. claude_mpm/commands/mpm-help.md +12 -205
  139. claude_mpm/commands/mpm-init.md +88 -506
  140. claude_mpm/commands/mpm-monitor.md +22 -401
  141. claude_mpm/commands/mpm-organize.md +70 -442
  142. claude_mpm/commands/mpm-postmortem.md +13 -107
  143. claude_mpm/commands/mpm-session-resume.md +20 -363
  144. claude_mpm/commands/mpm-status.md +13 -69
  145. claude_mpm/commands/mpm-ticket-view.md +60 -495
  146. claude_mpm/commands/mpm-version.md +13 -107
  147. claude_mpm/commands/mpm.md +8 -0
  148. claude_mpm/config/agent_presets.py +8 -7
  149. claude_mpm/config/skill_sources.py +16 -0
  150. claude_mpm/constants.py +1 -0
  151. claude_mpm/core/claude_runner.py +154 -2
  152. claude_mpm/core/config.py +37 -26
  153. claude_mpm/core/config_constants.py +74 -9
  154. claude_mpm/core/constants.py +56 -12
  155. claude_mpm/core/framework/loaders/agent_loader.py +1 -1
  156. claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
  157. claude_mpm/core/hook_manager.py +51 -3
  158. claude_mpm/core/interactive_session.py +12 -11
  159. claude_mpm/core/logger.py +26 -9
  160. claude_mpm/core/logging_utils.py +39 -13
  161. claude_mpm/core/network_config.py +148 -0
  162. claude_mpm/core/oneshot_session.py +7 -6
  163. claude_mpm/core/optimized_startup.py +61 -0
  164. claude_mpm/core/output_style_manager.py +66 -18
  165. claude_mpm/core/shared/config_loader.py +3 -1
  166. claude_mpm/core/socketio_pool.py +47 -15
  167. claude_mpm/core/unified_agent_registry.py +1 -1
  168. claude_mpm/core/unified_config.py +54 -8
  169. claude_mpm/core/unified_paths.py +95 -90
  170. claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
  171. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  172. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  173. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/1WZnGYqX.js +24 -0
  174. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
  175. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
  176. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
  177. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
  178. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
  179. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
  180. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.js +1 -0
  181. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
  182. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BRcwIQNr.js +4 -0
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
  184. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
  185. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
  186. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
  187. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
  188. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  189. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  190. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C3rbW_a-.js +1 -0
  191. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
  192. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
  193. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
  194. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
  195. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
  196. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
  197. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
  198. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  199. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
  200. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
  201. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
  202. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
  203. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
  204. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
  205. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
  206. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
  207. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
  208. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
  209. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
  210. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DR8nis88.js +2 -0
  211. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
  212. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
  213. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
  214. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
  215. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
  216. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
  217. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
  218. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
  219. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
  220. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
  221. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  222. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
  223. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
  224. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
  225. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
  226. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  227. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
  228. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
  229. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
  230. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
  231. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  232. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.RgBboRvH.js +1 -0
  233. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
  234. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  235. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
  236. claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
  237. claude_mpm/dashboard/static/svelte-build/index.html +36 -0
  238. claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
  239. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
  240. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
  241. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
  242. claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
  243. claude_mpm/experimental/cli_enhancements.py +2 -1
  244. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  245. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  246. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  247. claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
  248. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  249. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  250. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  251. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  252. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  253. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  254. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
  255. claude_mpm/hooks/claude_hooks/event_handlers.py +527 -136
  256. claude_mpm/hooks/claude_hooks/hook_handler.py +313 -99
  257. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  258. claude_mpm/hooks/claude_hooks/installer.py +206 -36
  259. claude_mpm/hooks/claude_hooks/memory_integration.py +52 -32
  260. claude_mpm/hooks/claude_hooks/response_tracking.py +43 -60
  261. claude_mpm/hooks/claude_hooks/services/__init__.py +21 -0
  262. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  263. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  264. claude_mpm/hooks/claude_hooks/services/__pycache__/container.cpython-311.pyc +0 -0
  265. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  266. claude_mpm/hooks/claude_hooks/services/__pycache__/protocols.cpython-311.pyc +0 -0
  267. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  268. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  269. claude_mpm/hooks/claude_hooks/services/connection_manager.py +67 -32
  270. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +38 -105
  271. claude_mpm/hooks/claude_hooks/services/container.py +310 -0
  272. claude_mpm/hooks/claude_hooks/services/protocols.py +328 -0
  273. claude_mpm/hooks/claude_hooks/services/state_manager.py +25 -38
  274. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +75 -77
  275. claude_mpm/hooks/kuzu_memory_hook.py +5 -5
  276. claude_mpm/hooks/session_resume_hook.py +89 -1
  277. claude_mpm/hooks/templates/pre_tool_use_simple.py +6 -6
  278. claude_mpm/hooks/templates/pre_tool_use_template.py +16 -8
  279. claude_mpm/init.py +276 -0
  280. claude_mpm/models/git_repository.py +3 -3
  281. claude_mpm/scripts/claude-hook-handler.sh +46 -19
  282. claude_mpm/services/agents/agent_builder.py +3 -3
  283. claude_mpm/services/agents/agent_recommendation_service.py +8 -8
  284. claude_mpm/services/agents/agent_selection_service.py +2 -2
  285. claude_mpm/services/agents/cache_git_manager.py +7 -7
  286. claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
  287. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -2
  288. claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
  289. claude_mpm/services/agents/deployment/agent_template_builder.py +39 -19
  290. claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
  291. claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
  292. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  293. claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
  294. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +169 -26
  295. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +101 -75
  296. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  297. claude_mpm/services/agents/git_source_manager.py +23 -4
  298. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  299. claude_mpm/services/agents/recommender.py +5 -3
  300. claude_mpm/services/agents/single_tier_deployment_service.py +6 -6
  301. claude_mpm/services/agents/sources/git_source_sync_service.py +121 -10
  302. claude_mpm/services/agents/startup_sync.py +27 -4
  303. claude_mpm/services/cli/__init__.py +3 -0
  304. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  305. claude_mpm/services/cli/session_resume_helper.py +10 -2
  306. claude_mpm/services/command_deployment_service.py +44 -26
  307. claude_mpm/services/delegation_detector.py +175 -0
  308. claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
  309. claude_mpm/services/diagnostics/checks/agent_sources_check.py +31 -1
  310. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  311. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  312. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  313. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  314. claude_mpm/services/diagnostics/models.py +14 -1
  315. claude_mpm/services/event_log.py +325 -0
  316. claude_mpm/services/git/git_operations_service.py +8 -8
  317. claude_mpm/services/hook_installer_service.py +77 -8
  318. claude_mpm/services/infrastructure/__init__.py +4 -0
  319. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  320. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  321. claude_mpm/services/monitor/daemon_manager.py +15 -4
  322. claude_mpm/services/monitor/management/lifecycle.py +15 -3
  323. claude_mpm/services/monitor/server.py +571 -11
  324. claude_mpm/services/pm_skills_deployer.py +884 -0
  325. claude_mpm/services/profile_manager.py +337 -0
  326. claude_mpm/services/skills/git_skill_source_manager.py +281 -20
  327. claude_mpm/services/skills/selective_skill_deployer.py +211 -46
  328. claude_mpm/services/skills/skill_discovery_service.py +74 -4
  329. claude_mpm/services/skills_deployer.py +192 -70
  330. claude_mpm/services/socketio/dashboard_server.py +1 -0
  331. claude_mpm/services/socketio/event_normalizer.py +37 -6
  332. claude_mpm/services/socketio/handlers/hook.py +14 -7
  333. claude_mpm/services/socketio/server/core.py +262 -123
  334. claude_mpm/services/socketio/server/main.py +12 -4
  335. claude_mpm/skills/__init__.py +2 -1
  336. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  337. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  338. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  339. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  340. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  341. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  342. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  343. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  344. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  345. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  346. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  347. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  348. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  349. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  350. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  351. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  352. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  353. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  354. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  355. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  356. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  357. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  358. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  359. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  360. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  361. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  362. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  363. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  364. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  365. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  366. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  367. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  368. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  369. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  370. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  371. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  372. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  373. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  374. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  375. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  376. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  377. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  378. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  379. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  380. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  381. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  382. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  383. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  384. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  385. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  386. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  387. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  388. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  389. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  390. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  391. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  392. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  393. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  394. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  395. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  396. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  397. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  398. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  399. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  400. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  401. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  402. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  403. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  404. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  405. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  406. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  407. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  408. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  409. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  410. claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
  411. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  412. claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
  413. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  414. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  415. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  416. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  417. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  418. claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
  419. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  420. claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
  421. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  422. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  423. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  424. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  425. claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
  426. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  427. claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
  428. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  429. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  430. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  431. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  432. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  433. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  434. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  435. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  436. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  437. claude_mpm/skills/bundled/security-scanning.md +112 -0
  438. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  439. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  440. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  441. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  442. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  443. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  444. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  445. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  446. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  447. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  448. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  449. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  450. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  451. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  452. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  453. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  454. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  455. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  456. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  457. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  458. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  459. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  460. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  461. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  462. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  463. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  464. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  465. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  466. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  467. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  468. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  469. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  470. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  471. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  472. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  473. claude_mpm/skills/registry.py +295 -90
  474. claude_mpm/skills/skill_manager.py +98 -3
  475. claude_mpm/templates/.pre-commit-config.yaml +112 -0
  476. claude_mpm/utils/agent_dependency_loader.py +115 -4
  477. claude_mpm/utils/agent_filters.py +1 -1
  478. claude_mpm/utils/migration.py +4 -4
  479. claude_mpm/utils/robust_installer.py +86 -21
  480. claude_mpm-5.6.34.dist-info/METADATA +393 -0
  481. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/RECORD +486 -145
  482. claude_mpm-5.4.22.dist-info/METADATA +0 -996
  483. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/WHEEL +0 -0
  484. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/entry_points.txt +0 -0
  485. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE +0 -0
  486. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  487. {claude_mpm-5.4.22.dist-info → claude_mpm-5.6.34.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,639 @@
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