claude-mpm 5.4.55__py3-none-any.whl → 5.6.1__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 (401) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
  3. claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
  4. claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +109 -1925
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +111 -686
  6. claude_mpm/agents/WORKFLOW.md +2 -0
  7. claude_mpm/agents/templates/circuit-breakers.md +26 -17
  8. claude_mpm/cli/__init__.py +5 -1
  9. claude_mpm/cli/commands/agents.py +2 -4
  10. claude_mpm/cli/commands/agents_reconcile.py +197 -0
  11. claude_mpm/cli/commands/autotodos.py +566 -0
  12. claude_mpm/cli/commands/commander.py +46 -0
  13. claude_mpm/cli/commands/configure.py +620 -21
  14. claude_mpm/cli/commands/hook_errors.py +60 -60
  15. claude_mpm/cli/commands/monitor.py +2 -2
  16. claude_mpm/cli/commands/mpm_init/core.py +2 -2
  17. claude_mpm/cli/commands/run.py +35 -3
  18. claude_mpm/cli/commands/skills.py +166 -14
  19. claude_mpm/cli/executor.py +120 -16
  20. claude_mpm/cli/interactive/__init__.py +10 -0
  21. claude_mpm/cli/interactive/agent_wizard.py +30 -50
  22. claude_mpm/cli/interactive/questionary_styles.py +65 -0
  23. claude_mpm/cli/interactive/skill_selector.py +481 -0
  24. claude_mpm/cli/parsers/base_parser.py +76 -1
  25. claude_mpm/cli/parsers/commander_parser.py +83 -0
  26. claude_mpm/cli/parsers/run_parser.py +10 -0
  27. claude_mpm/cli/startup.py +276 -403
  28. claude_mpm/cli/startup_display.py +72 -5
  29. claude_mpm/cli/startup_logging.py +2 -2
  30. claude_mpm/cli/utils.py +7 -3
  31. claude_mpm/commander/__init__.py +72 -0
  32. claude_mpm/commander/adapters/__init__.py +31 -0
  33. claude_mpm/commander/adapters/base.py +191 -0
  34. claude_mpm/commander/adapters/claude_code.py +361 -0
  35. claude_mpm/commander/adapters/communication.py +366 -0
  36. claude_mpm/commander/api/__init__.py +16 -0
  37. claude_mpm/commander/api/app.py +105 -0
  38. claude_mpm/commander/api/errors.py +112 -0
  39. claude_mpm/commander/api/routes/__init__.py +8 -0
  40. claude_mpm/commander/api/routes/events.py +184 -0
  41. claude_mpm/commander/api/routes/inbox.py +171 -0
  42. claude_mpm/commander/api/routes/messages.py +148 -0
  43. claude_mpm/commander/api/routes/projects.py +271 -0
  44. claude_mpm/commander/api/routes/sessions.py +215 -0
  45. claude_mpm/commander/api/routes/work.py +260 -0
  46. claude_mpm/commander/api/schemas.py +182 -0
  47. claude_mpm/commander/chat/__init__.py +7 -0
  48. claude_mpm/commander/chat/cli.py +107 -0
  49. claude_mpm/commander/chat/commands.py +96 -0
  50. claude_mpm/commander/chat/repl.py +310 -0
  51. claude_mpm/commander/config.py +49 -0
  52. claude_mpm/commander/config_loader.py +115 -0
  53. claude_mpm/commander/daemon.py +398 -0
  54. claude_mpm/commander/events/__init__.py +26 -0
  55. claude_mpm/commander/events/manager.py +332 -0
  56. claude_mpm/commander/frameworks/__init__.py +12 -0
  57. claude_mpm/commander/frameworks/base.py +143 -0
  58. claude_mpm/commander/frameworks/claude_code.py +58 -0
  59. claude_mpm/commander/frameworks/mpm.py +62 -0
  60. claude_mpm/commander/inbox/__init__.py +16 -0
  61. claude_mpm/commander/inbox/dedup.py +128 -0
  62. claude_mpm/commander/inbox/inbox.py +224 -0
  63. claude_mpm/commander/inbox/models.py +70 -0
  64. claude_mpm/commander/instance_manager.py +337 -0
  65. claude_mpm/commander/llm/__init__.py +6 -0
  66. claude_mpm/commander/llm/openrouter_client.py +167 -0
  67. claude_mpm/commander/llm/summarizer.py +70 -0
  68. claude_mpm/commander/models/__init__.py +18 -0
  69. claude_mpm/commander/models/events.py +121 -0
  70. claude_mpm/commander/models/project.py +162 -0
  71. claude_mpm/commander/models/work.py +214 -0
  72. claude_mpm/commander/parsing/__init__.py +20 -0
  73. claude_mpm/commander/parsing/extractor.py +132 -0
  74. claude_mpm/commander/parsing/output_parser.py +270 -0
  75. claude_mpm/commander/parsing/patterns.py +100 -0
  76. claude_mpm/commander/persistence/__init__.py +11 -0
  77. claude_mpm/commander/persistence/event_store.py +274 -0
  78. claude_mpm/commander/persistence/state_store.py +309 -0
  79. claude_mpm/commander/persistence/work_store.py +164 -0
  80. claude_mpm/commander/polling/__init__.py +13 -0
  81. claude_mpm/commander/polling/event_detector.py +104 -0
  82. claude_mpm/commander/polling/output_buffer.py +49 -0
  83. claude_mpm/commander/polling/output_poller.py +153 -0
  84. claude_mpm/commander/project_session.py +268 -0
  85. claude_mpm/commander/proxy/__init__.py +12 -0
  86. claude_mpm/commander/proxy/formatter.py +89 -0
  87. claude_mpm/commander/proxy/output_handler.py +191 -0
  88. claude_mpm/commander/proxy/relay.py +155 -0
  89. claude_mpm/commander/registry.py +404 -0
  90. claude_mpm/commander/runtime/__init__.py +10 -0
  91. claude_mpm/commander/runtime/executor.py +191 -0
  92. claude_mpm/commander/runtime/monitor.py +316 -0
  93. claude_mpm/commander/session/__init__.py +6 -0
  94. claude_mpm/commander/session/context.py +81 -0
  95. claude_mpm/commander/session/manager.py +59 -0
  96. claude_mpm/commander/tmux_orchestrator.py +361 -0
  97. claude_mpm/commander/web/__init__.py +1 -0
  98. claude_mpm/commander/work/__init__.py +30 -0
  99. claude_mpm/commander/work/executor.py +189 -0
  100. claude_mpm/commander/work/queue.py +405 -0
  101. claude_mpm/commander/workflow/__init__.py +27 -0
  102. claude_mpm/commander/workflow/event_handler.py +219 -0
  103. claude_mpm/commander/workflow/notifier.py +146 -0
  104. claude_mpm/commands/mpm-config.md +8 -0
  105. claude_mpm/commands/mpm-doctor.md +8 -0
  106. claude_mpm/commands/mpm-help.md +8 -0
  107. claude_mpm/commands/mpm-init.md +8 -0
  108. claude_mpm/commands/mpm-monitor.md +8 -0
  109. claude_mpm/commands/mpm-organize.md +8 -0
  110. claude_mpm/commands/mpm-postmortem.md +8 -0
  111. claude_mpm/commands/mpm-session-resume.md +9 -1
  112. claude_mpm/commands/mpm-status.md +8 -0
  113. claude_mpm/commands/mpm-ticket-view.md +8 -0
  114. claude_mpm/commands/mpm-version.md +8 -0
  115. claude_mpm/commands/mpm.md +8 -0
  116. claude_mpm/config/agent_presets.py +8 -7
  117. claude_mpm/constants.py +1 -0
  118. claude_mpm/core/claude_runner.py +2 -2
  119. claude_mpm/core/config.py +5 -0
  120. claude_mpm/core/hook_manager.py +51 -3
  121. claude_mpm/core/interactive_session.py +7 -7
  122. claude_mpm/core/logger.py +10 -7
  123. claude_mpm/core/logging_utils.py +4 -2
  124. claude_mpm/core/output_style_manager.py +31 -13
  125. claude_mpm/core/unified_config.py +54 -8
  126. claude_mpm/core/unified_paths.py +30 -13
  127. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
  128. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
  129. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cs_tUR18.js → 1WZnGYqX.js} +1 -1
  130. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CDuw-vjf.js → 67pF3qNn.js} +1 -1
  131. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bTOqqlTd.js → 6RxdMKe4.js} +1 -1
  132. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DwBR2MJi.js → 8cZrfX0h.js} +1 -1
  133. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{ZGh7QtNv.js → 9a6T2nm-.js} +1 -1
  134. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D9lljYKQ.js → B443AUzu.js} +1 -1
  135. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{RJiighC3.js → B8AwtY2H.js} +1 -1
  136. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uuIeMWc-.js → BF15LAsF.js} +1 -1
  137. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D3k0OPJN.js → BRcwIQNr.js} +1 -1
  138. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CyWMqx4W.js → BV6nKitt.js} +1 -1
  139. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CiIAseT4.js → BViJ8lZt.js} +5 -5
  140. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CBBdVcY8.js → BcQ-Q0FE.js} +1 -1
  141. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BovzEFCE.js → Bpyvgze_.js} +1 -1
  142. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
  143. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
  144. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{eNVUfhuA.js → C3rbW_a-.js} +1 -1
  145. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{GYwsonyD.js → C8WYN38h.js} +1 -1
  146. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BIF9m_hv.js → C9I8FlXH.js} +1 -1
  147. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B0uc0UOD.js → CIQcWgO2.js} +3 -3
  148. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Be7GpZd6.js → CIctN7YN.js} +1 -1
  149. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Bh0LDWpI.js → CKrS_JZW.js} +2 -2
  150. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DUrLdbGD.js → CR6P9C4A.js} +1 -1
  151. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7xVLGWV.js → CRRR9MD_.js} +1 -1
  152. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
  153. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dhb8PKl3.js → CSXtMOf0.js} +1 -1
  154. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BPYeabCQ.js → CT-sbxSk.js} +1 -1
  155. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{sQeU3Y1z.js → CWm6DJsp.js} +1 -1
  156. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CnA0NrzZ.js → CpqQ1Kzn.js} +1 -1
  157. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4B-KCzX.js → D2nGpDRe.js} +1 -1
  158. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DGkLK5U1.js → D9iCMida.js} +1 -1
  159. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BofRWZRR.js → D9ykgMoY.js} +1 -1
  160. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DmxopI1J.js → DL2Ldur1.js} +1 -1
  161. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C30mlcqg.js → DPfltzjH.js} +1 -1
  162. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Vzk33B_K.js → DR8nis88.js} +2 -2
  163. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DI7hHRFL.js → DUliQN2b.js} +1 -1
  164. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4JcI4KD.js → DXlhR01x.js} +1 -1
  165. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bT1r9zLR.js → D_lyTybS.js} +1 -1
  166. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DZX00Y4g.js → DngoTTgh.js} +1 -1
  167. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzZX-COe.js → DqkmHtDC.js} +1 -1
  168. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7RN905-.js → DsDh8EYs.js} +1 -1
  169. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DLVjFsZ3.js → DypDmXgd.js} +1 -1
  170. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{iEWssX7S.js → IPYC-LnN.js} +1 -1
  171. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
  172. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DaimHw_p.js → JpevfAFt.js} +1 -1
  173. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DY1XQ8fi.js → R8CEIRAd.js} +1 -1
  174. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dle-35c7.js → Zxy7qc-l.js} +2 -2
  175. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
  176. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C_Usid8X.js → qtd3IeO4.js} +2 -2
  177. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzeYkLYB.js → ulBFON_C.js} +2 -2
  178. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cfqx1Qun.js → wQVh1CoA.js} +1 -1
  179. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/{app.D6-I5TpK.js → app.Dr7t0z2J.js} +2 -2
  180. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
  181. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.m1gL8KXf.js → 0.RgBboRvH.js} +1 -1
  182. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{1.CgNOuw-d.js → 1.DG-KkbDf.js} +1 -1
  183. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
  184. claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
  185. claude_mpm/dashboard/static/svelte-build/index.html +9 -9
  186. claude_mpm/experimental/cli_enhancements.py +2 -1
  187. claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
  188. claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
  189. claude_mpm/hooks/claude_hooks/auto_pause_handler.py +486 -0
  190. claude_mpm/hooks/claude_hooks/event_handlers.py +250 -11
  191. claude_mpm/hooks/claude_hooks/hook_handler.py +106 -89
  192. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
  193. claude_mpm/hooks/claude_hooks/installer.py +69 -5
  194. claude_mpm/hooks/claude_hooks/response_tracking.py +3 -1
  195. claude_mpm/hooks/claude_hooks/services/connection_manager.py +20 -0
  196. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +14 -77
  197. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +30 -6
  198. claude_mpm/hooks/session_resume_hook.py +85 -1
  199. claude_mpm/init.py +1 -1
  200. claude_mpm/scripts/claude-hook-handler.sh +36 -10
  201. claude_mpm/scripts/start_activity_logging.py +0 -0
  202. claude_mpm/services/agents/agent_recommendation_service.py +8 -8
  203. claude_mpm/services/agents/cache_git_manager.py +1 -1
  204. claude_mpm/services/agents/deployment/agent_template_builder.py +8 -0
  205. claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
  206. claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +3 -0
  207. claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
  208. claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
  209. claude_mpm/services/agents/sources/git_source_sync_service.py +7 -4
  210. claude_mpm/services/agents/startup_sync.py +5 -2
  211. claude_mpm/services/cli/__init__.py +3 -0
  212. claude_mpm/services/cli/incremental_pause_manager.py +561 -0
  213. claude_mpm/services/cli/session_resume_helper.py +10 -2
  214. claude_mpm/services/delegation_detector.py +175 -0
  215. claude_mpm/services/diagnostics/checks/agent_sources_check.py +30 -0
  216. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
  217. claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
  218. claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
  219. claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
  220. claude_mpm/services/diagnostics/models.py +14 -1
  221. claude_mpm/services/event_log.py +325 -0
  222. claude_mpm/services/infrastructure/__init__.py +4 -0
  223. claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
  224. claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
  225. claude_mpm/services/monitor/daemon_manager.py +15 -4
  226. claude_mpm/services/monitor/management/lifecycle.py +8 -2
  227. claude_mpm/services/monitor/server.py +106 -16
  228. claude_mpm/services/pm_skills_deployer.py +261 -85
  229. claude_mpm/services/skills/git_skill_source_manager.py +75 -10
  230. claude_mpm/services/skills/selective_skill_deployer.py +177 -80
  231. claude_mpm/services/skills/skill_discovery_service.py +57 -3
  232. claude_mpm/services/socketio/handlers/hook.py +14 -7
  233. claude_mpm/services/socketio/server/main.py +12 -4
  234. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  235. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  236. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  237. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  238. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  239. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  240. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  241. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  242. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  243. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  244. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  245. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  246. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  247. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  248. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  249. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  250. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  251. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  252. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  253. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  254. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  255. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  256. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  257. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  258. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  259. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  260. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  261. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  262. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  263. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  264. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  265. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  266. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  267. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  268. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  269. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  270. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  271. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  272. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  273. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  274. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  275. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  276. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  277. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  278. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  279. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  280. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  281. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  282. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  283. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  284. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  285. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  286. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  287. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  288. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  289. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  290. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  291. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  292. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  293. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  294. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  295. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  296. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  297. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  298. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  299. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  300. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  301. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  302. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  303. claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
  304. claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
  305. claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
  306. claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
  307. claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
  308. claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
  309. claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
  310. claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
  311. claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
  312. claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
  313. claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
  314. claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
  315. claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
  316. claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
  317. claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
  318. claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
  319. claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
  320. claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
  321. claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
  322. claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
  323. claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
  324. claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
  325. claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
  326. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  327. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  328. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  329. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  330. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  331. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  332. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  333. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  334. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  335. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  336. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  337. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  338. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  339. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  340. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  341. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  342. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  343. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  344. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  345. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  346. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  347. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  348. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  349. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  350. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  351. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  352. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  353. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  354. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  355. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  356. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  357. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  358. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  359. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  360. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  361. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  362. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  363. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  364. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  365. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  366. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  367. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  368. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  369. claude_mpm/skills/skill_manager.py +4 -4
  370. claude_mpm/utils/agent_dependency_loader.py +103 -4
  371. claude_mpm/utils/robust_installer.py +45 -24
  372. claude_mpm-5.6.1.dist-info/METADATA +391 -0
  373. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/RECORD +377 -166
  374. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +0 -1
  375. claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +0 -1
  376. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +0 -1
  377. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +0 -24
  378. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +0 -1
  379. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +0 -1
  380. claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +0 -323
  381. claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +0 -1
  382. claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +0 -1
  383. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
  384. claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
  385. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
  386. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
  387. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
  388. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
  389. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
  390. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
  391. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
  392. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
  393. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
  394. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
  395. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
  396. claude_mpm-5.4.55.dist-info/METADATA +0 -999
  397. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/WHEEL +0 -0
  398. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/entry_points.txt +0 -0
  399. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/licenses/LICENSE +0 -0
  400. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/licenses/LICENSE-FAQ.md +0 -0
  401. {claude_mpm-5.4.55.dist-info → claude_mpm-5.6.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,543 @@
1
+ # TDD Anti-Patterns
2
+
3
+ > **Part of**: [Test-Driven Development](../SKILL.md)
4
+ > **Category**: testing
5
+ > **Reading Level**: Intermediate
6
+
7
+ ## Purpose
8
+
9
+ Common TDD mistakes, rationalizations, and red flags to avoid. Learn to recognize when you're violating test-driven development principles.
10
+
11
+ ## Red Flags - Recognize and Stop
12
+
13
+ ### "I'll Write Tests After to Verify It Works"
14
+
15
+ **What It Sounds Like:**
16
+ - "Let me confirm this works first, then I'll test"
17
+ - "I'll add tests once the feature is done"
18
+ - "Tests are part of cleanup, I'll do them later"
19
+
20
+ **Why It's Wrong:**
21
+ - Tests passing immediately prove nothing
22
+ - Didn't watch test fail = don't know if test works
23
+ - Implementation may be hard to test (too late to redesign)
24
+ - "Later" often becomes "never"
25
+
26
+ **Reality Check:**
27
+ ```typescript
28
+ // Test-after: Passes immediately
29
+ test('validates email', () => {
30
+ expect(validateEmail('test@example.com')).toBe(true);
31
+ });
32
+ // ✓ PASS
33
+
34
+ // But you never saw it fail!
35
+ // Does it actually test anything? Unknown.
36
+ ```
37
+
38
+ **What to Do Instead:**
39
+ ```typescript
40
+ // Test-first: Watch it fail
41
+ test('validates email', () => {
42
+ expect(validateEmail('test@example.com')).toBe(true);
43
+ });
44
+ // ✗ FAIL: validateEmail is not defined
45
+
46
+ // Implement
47
+ function validateEmail(email: string): boolean {
48
+ return email.includes('@');
49
+ }
50
+
51
+ // ✓ PASS: Now you know test works
52
+ ```
53
+
54
+ ### "Keep as Reference, Write Tests First"
55
+
56
+ **What It Sounds Like:**
57
+ - "I'll keep this code as a reference while writing tests"
58
+ - "I'll adapt this implementation while test-driving"
59
+ - "Let me look at what I built to write better tests"
60
+
61
+ **Why It's Wrong:**
62
+ - You WILL adapt existing code (human nature)
63
+ - "Adapt" = testing after, not testing first
64
+ - Reference biases your test design
65
+ - Defeats purpose of TDD
66
+
67
+ **Reality Check:**
68
+ ```typescript
69
+ // You wrote this "reference":
70
+ function processUser(user: any) {
71
+ const valid = user.email && user.age >= 18 && user.name;
72
+ if (!valid) throw new Error('Invalid');
73
+ return { id: generateId(), ...user };
74
+ }
75
+
76
+ // Now you write "test-first" while looking at it:
77
+ test('processes valid user', () => {
78
+ const user = { email: 'test@example.com', age: 25, name: 'Test' };
79
+ const result = processUser(user);
80
+ expect(result.id).toBeDefined();
81
+ });
82
+
83
+ // You just tested what you built, not what it should do
84
+ ```
85
+
86
+ **What to Do Instead:**
87
+ ```
88
+ Delete the code. Seriously. Delete it.
89
+
90
+ Then write test describing what SHOULD happen:
91
+ test('creates user with required fields', () => {
92
+ const user = createUser({
93
+ email: 'test@example.com',
94
+ age: 25,
95
+ name: 'Test User'
96
+ });
97
+
98
+ expect(user).toMatchObject({
99
+ id: expect.any(String),
100
+ email: 'test@example.com',
101
+ age: 25,
102
+ name: 'Test User'
103
+ });
104
+ });
105
+
106
+ Now implement fresh from test.
107
+ ```
108
+
109
+ ### "Already Spent X Hours, Deleting Is Wasteful"
110
+
111
+ **What It Sounds Like:**
112
+ - "I can't throw away 4 hours of work"
113
+ - "Let me just add tests to verify what I built"
114
+ - "Rewriting would take too long"
115
+
116
+ **Why It's Wrong:**
117
+ - Sunk cost fallacy
118
+ - Time already gone, can't recover it
119
+ - Keeping unverified code = technical debt
120
+ - Will spend more time debugging
121
+
122
+ **Reality Check:**
123
+ ```
124
+ Time spent: 4 hours
125
+ Code quality: Unknown
126
+ Test coverage: None
127
+ Technical debt: High
128
+
129
+ Option A: Keep it and test after
130
+ Time: 4 hours (sunk) + 30 min (weak tests) + 120 min (future debugging)
131
+ Total: 6.5 hours
132
+ Quality: Low
133
+
134
+ Option B: Delete and TDD
135
+ Time: 4 hours (sunk) + 2 hours (TDD rewrite)
136
+ Total: 6 hours
137
+ Quality: High
138
+
139
+ Option B is objectively better.
140
+ ```
141
+
142
+ **What to Do Instead:**
143
+ - Accept sunk cost
144
+ - Treat it as learning time
145
+ - Delete code
146
+ - Rewrite with TDD (will be faster, you know the problem now)
147
+
148
+ ### "Tests After Achieve the Same Purpose"
149
+
150
+ **What It Sounds Like:**
151
+ - "I'll have 100% coverage either way"
152
+ - "Tests-after verify correctness just as well"
153
+ - "It's about the spirit, not the ritual"
154
+ - "Being pragmatic means adapting"
155
+
156
+ **Why It's Wrong:**
157
+ - Coverage ≠ quality
158
+ - Tests-after verify what you remembered
159
+ - Can't achieve TDD spirit without TDD practice
160
+ - Tests-after is optimistic gambling, not pragmatic
161
+
162
+ **Reality Check:**
163
+ ```typescript
164
+ // Test-after: 100% coverage, useless
165
+ function add(a: number, b: number): number {
166
+ return a - b; // BUG
167
+ }
168
+
169
+ test('add function', () => {
170
+ add(2, 3); // 100% coverage!
171
+ // But doesn't verify result
172
+ });
173
+
174
+ // Test-first: Forces verification
175
+ test('adds two numbers', () => {
176
+ expect(add(2, 3)).toBe(5); // Must verify behavior
177
+ });
178
+ ```
179
+
180
+ See [Philosophy](philosophy.md) for detailed explanation.
181
+
182
+ ### "This Is Different Because..."
183
+
184
+ **What It Sounds Like:**
185
+ - "This is too simple for TDD"
186
+ - "This is too complex for TDD"
187
+ - "This is exploratory code"
188
+ - "This is just a quick bug fix"
189
+ - "This is legacy code (can't test)"
190
+
191
+ **Why It's Wrong:**
192
+ - Every situation has an excuse
193
+ - All excuses are invalid
194
+ - "Just this once" becomes "always"
195
+
196
+ **Reality Check:**
197
+
198
+ | Excuse | Truth |
199
+ |--------|-------|
200
+ | "Too simple" | Simple code breaks too |
201
+ | "Too complex" | Complex code NEEDS tests |
202
+ | "Exploratory" | Exploration teaches what to test |
203
+ | "Quick fix" | Quick fixes need regression protection |
204
+ | "Legacy code" | Characterization tests enable refactoring |
205
+
206
+ **What to Do Instead:**
207
+ - Stop rationalizing
208
+ - Follow TDD process
209
+ - Every. Single. Time.
210
+
211
+ ## Common Anti-Patterns
212
+
213
+ ### Pattern: Testing Implementation, Not Behavior
214
+
215
+ **Bad:**
216
+ ```typescript
217
+ test('uses regex to validate email', () => {
218
+ const validator = new EmailValidator();
219
+ expect(validator.pattern).toBe(/^[^\s@]+@[^\s@]+\.[^\s@]+$/);
220
+ });
221
+ ```
222
+
223
+ **Why Wrong:** Tests HOW, not WHAT. Prevents refactoring.
224
+
225
+ **Good:**
226
+ ```typescript
227
+ test('accepts valid email format', () => {
228
+ expect(validateEmail('user@example.com')).toBe(true);
229
+ });
230
+
231
+ test('rejects email without @ symbol', () => {
232
+ expect(validateEmail('userexample.com')).toBe(false);
233
+ });
234
+ ```
235
+
236
+ **Why Right:** Tests behavior. Implementation can change freely.
237
+
238
+ ### Pattern: Mocking Everything
239
+
240
+ **Bad:**
241
+ ```typescript
242
+ test('processes user data', () => {
243
+ const mockValidator = jest.fn().mockReturnValue(true);
244
+ const mockRepository = jest.fn().mockResolvedValue({ id: 1 });
245
+ const mockLogger = jest.fn();
246
+
247
+ const service = new UserService(mockValidator, mockRepository, mockLogger);
248
+
249
+ service.createUser({ name: 'Test' });
250
+
251
+ expect(mockValidator).toHaveBeenCalled();
252
+ expect(mockRepository).toHaveBeenCalled();
253
+ expect(mockLogger).toHaveBeenCalled();
254
+ });
255
+ ```
256
+
257
+ **Why Wrong:**
258
+ - Tests mock interactions, not real code
259
+ - Doesn't verify actual behavior
260
+ - Brittle (breaks on implementation changes)
261
+
262
+ **Good:**
263
+ ```typescript
264
+ test('creates user with valid data', async () => {
265
+ const service = new UserService();
266
+
267
+ const user = await service.createUser({
268
+ name: 'Test User',
269
+ email: 'test@example.com'
270
+ });
271
+
272
+ expect(user.id).toBeDefined();
273
+ expect(user.name).toBe('Test User');
274
+ expect(user.email).toBe('test@example.com');
275
+ });
276
+ ```
277
+
278
+ **Why Right:** Tests real behavior using real objects.
279
+
280
+ **When to Mock:** Only external dependencies you don't control (APIs, databases, file system).
281
+
282
+ ### Pattern: One Giant Test
283
+
284
+ **Bad:**
285
+ ```typescript
286
+ test('user registration flow', async () => {
287
+ // Test validates email
288
+ expect(validateEmail('test@example.com')).toBe(true);
289
+
290
+ // Test validates password
291
+ expect(validatePassword('Pass123')).toBe(true);
292
+
293
+ // Test creates user
294
+ const user = await createUser({...});
295
+ expect(user.id).toBeDefined();
296
+
297
+ // Test sends welcome email
298
+ expect(emailsSent).toContain('welcome');
299
+
300
+ // Test logs activity
301
+ expect(logs).toContain('user_created');
302
+ });
303
+ ```
304
+
305
+ **Why Wrong:**
306
+ - Tests multiple behaviors
307
+ - If fails, unclear what broke
308
+ - Hard to understand what's being tested
309
+ - Violates "one test, one behavior"
310
+
311
+ **Good:**
312
+ ```typescript
313
+ test('validates email format', () => {
314
+ expect(validateEmail('test@example.com')).toBe(true);
315
+ });
316
+
317
+ test('validates password strength', () => {
318
+ expect(validatePassword('Pass123')).toBe(true);
319
+ });
320
+
321
+ test('creates user with valid data', async () => {
322
+ const user = await createUser({...});
323
+ expect(user.id).toBeDefined();
324
+ });
325
+
326
+ test('sends welcome email after registration', async () => {
327
+ await createUser({...});
328
+ expect(emailsSent).toContain('welcome');
329
+ });
330
+ ```
331
+
332
+ **Why Right:** Each test has single, clear purpose.
333
+
334
+ ### Pattern: Vague Assertions
335
+
336
+ **Bad:**
337
+ ```typescript
338
+ test('processes array', () => {
339
+ const result = processArray([1, 2, 3]);
340
+ expect(result).toBeDefined();
341
+ expect(result.length).toBeGreaterThan(0);
342
+ });
343
+ ```
344
+
345
+ **Why Wrong:**
346
+ - Doesn't verify actual behavior
347
+ - Many wrong implementations would pass
348
+ - Provides false confidence
349
+
350
+ **Good:**
351
+ ```typescript
352
+ test('doubles each element in array', () => {
353
+ const result = processArray([1, 2, 3]);
354
+ expect(result).toEqual([2, 4, 6]);
355
+ });
356
+ ```
357
+
358
+ **Why Right:** Precise assertion. Only correct implementation passes.
359
+
360
+ ### Pattern: Skipping Verification Steps
361
+
362
+ **Bad:**
363
+ ```typescript
364
+ // Write test
365
+ test('retries on failure', async () => {
366
+ const result = await withRetry(operation);
367
+ expect(result).toBe('success');
368
+ });
369
+
370
+ // Implement immediately without running test
371
+ async function withRetry(fn) {
372
+ try {
373
+ return await fn();
374
+ } catch (e) {
375
+ return await fn();
376
+ }
377
+ }
378
+
379
+ // Run both tests together
380
+ // PASS: Both pass
381
+
382
+ // You never saw test fail!
383
+ ```
384
+
385
+ **Why Wrong:**
386
+ - Don't know if test actually tests anything
387
+ - Implementation might have already existed
388
+ - Test might be broken
389
+
390
+ **Good:**
391
+ ```typescript
392
+ // Write test
393
+ test('retries on failure', async () => {
394
+ const result = await withRetry(operation);
395
+ expect(result).toBe('success');
396
+ });
397
+
398
+ // MANDATORY: Run test FIRST
399
+ // FAIL: withRetry is not defined
400
+ // ✓ Good - test works
401
+
402
+ // Implement
403
+ async function withRetry(fn) {
404
+ try {
405
+ return await fn();
406
+ } catch (e) {
407
+ return await fn();
408
+ }
409
+ }
410
+
411
+ // Run test AGAIN
412
+ // PASS
413
+ // ✓ Good - implementation works
414
+ ```
415
+
416
+ **Why Right:** Verified test fails, verified test passes. Confidence high.
417
+
418
+ ## Rationalization Detection
419
+
420
+ ### Self-Assessment Questions
421
+
422
+ Ask yourself:
423
+
424
+ **Before skipping RED phase:**
425
+ - [ ] Am I making excuses?
426
+ - [ ] Do I think "just this once"?
427
+ - [ ] Am I under time pressure? (More reason for TDD!)
428
+ - [ ] Do I feel the process is "too slow"? (It's faster overall)
429
+
430
+ **After writing implementation first:**
431
+ - [ ] Did I write code before test?
432
+ - [ ] Am I now writing test to verify existing code?
433
+ - [ ] Will my test pass immediately?
434
+ - [ ] Did I watch the test fail first?
435
+
436
+ **When reviewing tests:**
437
+ - [ ] Did I watch each test fail before implementing?
438
+ - [ ] Does each test verify behavior, not implementation?
439
+ - [ ] Could I refactor without breaking tests?
440
+ - [ ] Do tests use real code (not excessive mocks)?
441
+
442
+ ### If Any Answer Is "No"
443
+
444
+ **STOP. You're not doing TDD.**
445
+
446
+ Options:
447
+ 1. Delete implementation, start with test
448
+ 2. Admit you're not doing TDD, accept consequences
449
+ 3. Ask for help understanding how to TDD this
450
+
451
+ ## Recovery from Anti-Patterns
452
+
453
+ ### If You Wrote Code First
454
+
455
+ **Option 1: Characterization Tests (if code works)**
456
+ ```typescript
457
+ // Write tests for current behavior
458
+ test('current behavior for case A', () => {
459
+ expect(existingFunction(inputA)).toBe(currentOutputA);
460
+ });
461
+
462
+ // Then refactor with test protection
463
+ // Then delete and rewrite with TDD for new features
464
+ ```
465
+
466
+ **Option 2: Delete and Restart (if code not verified)**
467
+ ```typescript
468
+ // Delete implementation
469
+ // Write failing test
470
+ // Implement from test
471
+ ```
472
+
473
+ ### If Tests Are Too Broad
474
+
475
+ **Refactor tests:**
476
+ ```typescript
477
+ // Before: One giant test
478
+ test('user registration', () => {
479
+ // 50 lines of test code
480
+ });
481
+
482
+ // After: Multiple focused tests
483
+ describe('User Registration', () => {
484
+ test('validates email format', () => {...});
485
+ test('validates password strength', () => {...});
486
+ test('creates user record', () => {...});
487
+ test('sends welcome email', () => {...});
488
+ });
489
+ ```
490
+
491
+ ### If Tests Are Brittle
492
+
493
+ **Refactor to test behavior:**
494
+ ```typescript
495
+ // Before: Tests implementation
496
+ test('uses bcrypt with 10 rounds', () => {
497
+ expect(hasher.algorithm).toBe('bcrypt');
498
+ expect(hasher.rounds).toBe(10);
499
+ });
500
+
501
+ // After: Tests behavior
502
+ test('hashes password securely', () => {
503
+ const hash1 = hashPassword('password');
504
+ const hash2 = hashPassword('password');
505
+
506
+ expect(hash1).not.toBe('password'); // Actually hashed
507
+ expect(hash1).not.toBe(hash2); // Salted
508
+ expect(verifyPassword('password', hash1)).toBe(true); // Verifiable
509
+ });
510
+ ```
511
+
512
+ ## Summary
513
+
514
+ **Red Flags:**
515
+ - Code before test
516
+ - Test passes immediately
517
+ - "I'll test after"
518
+ - "Keep as reference"
519
+ - "Deleting is wasteful"
520
+ - "Tests-after are equivalent"
521
+ - "This is different because..."
522
+
523
+ **Anti-Patterns:**
524
+ - Testing implementation not behavior
525
+ - Mocking everything
526
+ - One giant test
527
+ - Vague assertions
528
+ - Skipping verification steps
529
+
530
+ **Recovery:**
531
+ - Recognize the anti-pattern
532
+ - STOP immediately
533
+ - Delete or refactor
534
+ - Restart with proper TDD
535
+
536
+ **Remember:** Proper TDD requires discipline but saves time. Shortcuts feel faster but waste time.
537
+
538
+ ## Related References
539
+
540
+ - [Workflow](workflow.md): Correct TDD process
541
+ - [Examples](examples.md): Real-world TDD practice
542
+ - [Philosophy](philosophy.md): Why TDD works
543
+ - [Integration](integration.md): TDD with other skills