claude-mpm 5.4.41__py3-none-any.whl → 5.6.23__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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
- claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +109 -1925
- claude_mpm/agents/PM_INSTRUCTIONS.md +161 -298
- claude_mpm/agents/WORKFLOW.md +2 -0
- claude_mpm/agents/templates/circuit-breakers.md +26 -17
- claude_mpm/cli/__init__.py +5 -1
- claude_mpm/cli/commands/agents.py +2 -4
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/autotodos.py +566 -0
- claude_mpm/cli/commands/commander.py +216 -0
- claude_mpm/cli/commands/configure.py +620 -21
- claude_mpm/cli/commands/configure_agent_display.py +3 -1
- claude_mpm/cli/commands/hook_errors.py +60 -60
- claude_mpm/cli/commands/monitor.py +2 -2
- claude_mpm/cli/commands/mpm_init/core.py +15 -8
- claude_mpm/cli/commands/profile.py +9 -10
- claude_mpm/cli/commands/run.py +35 -3
- claude_mpm/cli/commands/skill_source.py +51 -2
- claude_mpm/cli/commands/skills.py +182 -32
- claude_mpm/cli/executor.py +120 -16
- claude_mpm/cli/interactive/__init__.py +10 -0
- claude_mpm/cli/interactive/agent_wizard.py +30 -50
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/parsers/base_parser.py +76 -1
- claude_mpm/cli/parsers/commander_parser.py +116 -0
- claude_mpm/cli/parsers/profile_parser.py +0 -1
- claude_mpm/cli/parsers/run_parser.py +10 -0
- claude_mpm/cli/parsers/skill_source_parser.py +4 -0
- claude_mpm/cli/parsers/skills_parser.py +2 -3
- claude_mpm/cli/startup.py +527 -506
- claude_mpm/cli/startup_display.py +74 -6
- claude_mpm/cli/startup_logging.py +2 -2
- claude_mpm/cli/utils.py +7 -3
- claude_mpm/commander/__init__.py +78 -0
- claude_mpm/commander/adapters/__init__.py +60 -0
- claude_mpm/commander/adapters/auggie.py +260 -0
- claude_mpm/commander/adapters/base.py +288 -0
- claude_mpm/commander/adapters/claude_code.py +392 -0
- claude_mpm/commander/adapters/codex.py +237 -0
- claude_mpm/commander/adapters/communication.py +366 -0
- claude_mpm/commander/adapters/example_usage.py +310 -0
- claude_mpm/commander/adapters/mpm.py +389 -0
- claude_mpm/commander/adapters/registry.py +204 -0
- claude_mpm/commander/api/__init__.py +16 -0
- claude_mpm/commander/api/app.py +121 -0
- claude_mpm/commander/api/errors.py +133 -0
- claude_mpm/commander/api/routes/__init__.py +8 -0
- claude_mpm/commander/api/routes/events.py +184 -0
- claude_mpm/commander/api/routes/inbox.py +171 -0
- claude_mpm/commander/api/routes/messages.py +148 -0
- claude_mpm/commander/api/routes/projects.py +271 -0
- claude_mpm/commander/api/routes/sessions.py +226 -0
- claude_mpm/commander/api/routes/work.py +296 -0
- claude_mpm/commander/api/schemas.py +186 -0
- claude_mpm/commander/chat/__init__.py +7 -0
- claude_mpm/commander/chat/cli.py +146 -0
- claude_mpm/commander/chat/commands.py +96 -0
- claude_mpm/commander/chat/repl.py +310 -0
- claude_mpm/commander/config.py +51 -0
- claude_mpm/commander/config_loader.py +115 -0
- claude_mpm/commander/core/__init__.py +10 -0
- claude_mpm/commander/core/block_manager.py +325 -0
- claude_mpm/commander/core/response_manager.py +323 -0
- claude_mpm/commander/daemon.py +603 -0
- claude_mpm/commander/env_loader.py +59 -0
- claude_mpm/commander/events/__init__.py +26 -0
- claude_mpm/commander/events/manager.py +332 -0
- claude_mpm/commander/frameworks/__init__.py +12 -0
- claude_mpm/commander/frameworks/base.py +146 -0
- claude_mpm/commander/frameworks/claude_code.py +58 -0
- claude_mpm/commander/frameworks/mpm.py +62 -0
- claude_mpm/commander/inbox/__init__.py +16 -0
- claude_mpm/commander/inbox/dedup.py +128 -0
- claude_mpm/commander/inbox/inbox.py +224 -0
- claude_mpm/commander/inbox/models.py +70 -0
- claude_mpm/commander/instance_manager.py +450 -0
- claude_mpm/commander/llm/__init__.py +6 -0
- claude_mpm/commander/llm/openrouter_client.py +167 -0
- claude_mpm/commander/llm/summarizer.py +70 -0
- claude_mpm/commander/memory/__init__.py +45 -0
- claude_mpm/commander/memory/compression.py +347 -0
- claude_mpm/commander/memory/embeddings.py +230 -0
- claude_mpm/commander/memory/entities.py +310 -0
- claude_mpm/commander/memory/example_usage.py +290 -0
- claude_mpm/commander/memory/integration.py +325 -0
- claude_mpm/commander/memory/search.py +381 -0
- claude_mpm/commander/memory/store.py +657 -0
- claude_mpm/commander/models/__init__.py +18 -0
- claude_mpm/commander/models/events.py +121 -0
- claude_mpm/commander/models/project.py +162 -0
- claude_mpm/commander/models/work.py +214 -0
- claude_mpm/commander/parsing/__init__.py +20 -0
- claude_mpm/commander/parsing/extractor.py +132 -0
- claude_mpm/commander/parsing/output_parser.py +270 -0
- claude_mpm/commander/parsing/patterns.py +100 -0
- claude_mpm/commander/persistence/__init__.py +11 -0
- claude_mpm/commander/persistence/event_store.py +274 -0
- claude_mpm/commander/persistence/state_store.py +309 -0
- claude_mpm/commander/persistence/work_store.py +164 -0
- claude_mpm/commander/polling/__init__.py +13 -0
- claude_mpm/commander/polling/event_detector.py +104 -0
- claude_mpm/commander/polling/output_buffer.py +49 -0
- claude_mpm/commander/polling/output_poller.py +153 -0
- claude_mpm/commander/project_session.py +268 -0
- claude_mpm/commander/proxy/__init__.py +12 -0
- claude_mpm/commander/proxy/formatter.py +89 -0
- claude_mpm/commander/proxy/output_handler.py +191 -0
- claude_mpm/commander/proxy/relay.py +155 -0
- claude_mpm/commander/registry.py +410 -0
- claude_mpm/commander/runtime/__init__.py +10 -0
- claude_mpm/commander/runtime/executor.py +191 -0
- claude_mpm/commander/runtime/monitor.py +346 -0
- claude_mpm/commander/session/__init__.py +6 -0
- claude_mpm/commander/session/context.py +81 -0
- claude_mpm/commander/session/manager.py +59 -0
- claude_mpm/commander/tmux_orchestrator.py +361 -0
- claude_mpm/commander/web/__init__.py +1 -0
- claude_mpm/commander/work/__init__.py +30 -0
- claude_mpm/commander/work/executor.py +207 -0
- claude_mpm/commander/work/queue.py +405 -0
- claude_mpm/commander/workflow/__init__.py +27 -0
- claude_mpm/commander/workflow/event_handler.py +241 -0
- claude_mpm/commander/workflow/notifier.py +146 -0
- claude_mpm/commands/mpm-config.md +8 -0
- claude_mpm/commands/mpm-doctor.md +8 -0
- claude_mpm/commands/mpm-help.md +8 -0
- claude_mpm/commands/mpm-init.md +8 -0
- claude_mpm/commands/mpm-monitor.md +8 -0
- claude_mpm/commands/mpm-organize.md +8 -0
- claude_mpm/commands/mpm-postmortem.md +8 -0
- claude_mpm/commands/mpm-session-resume.md +9 -1
- claude_mpm/commands/mpm-status.md +8 -0
- claude_mpm/commands/mpm-ticket-view.md +8 -0
- claude_mpm/commands/mpm-version.md +8 -0
- claude_mpm/commands/mpm.md +8 -0
- claude_mpm/config/agent_presets.py +8 -7
- claude_mpm/config/skill_sources.py +16 -0
- claude_mpm/constants.py +1 -0
- claude_mpm/core/claude_runner.py +154 -2
- claude_mpm/core/config.py +35 -22
- claude_mpm/core/config_constants.py +74 -9
- claude_mpm/core/constants.py +56 -12
- claude_mpm/core/hook_manager.py +51 -3
- claude_mpm/core/interactive_session.py +12 -11
- claude_mpm/core/logger.py +26 -9
- claude_mpm/core/logging_utils.py +35 -11
- claude_mpm/core/network_config.py +148 -0
- claude_mpm/core/oneshot_session.py +7 -6
- claude_mpm/core/optimized_startup.py +3 -1
- claude_mpm/core/output_style_manager.py +63 -18
- claude_mpm/core/shared/config_loader.py +3 -1
- claude_mpm/core/socketio_pool.py +13 -5
- claude_mpm/core/unified_config.py +54 -8
- claude_mpm/core/unified_paths.py +95 -90
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/1WZnGYqX.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BRcwIQNr.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uj46x2Wr.js → BSNlmTZj.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C3rbW_a-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{N4qtv3Hx.js → DR8nis88.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DjhvlsAc.js → NqQ1dWOy.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.CAGBuiOw.js → 0.RgBboRvH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -1
- claude_mpm/dashboard/static/svelte-build/index.html +11 -11
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- claude_mpm/experimental/cli_enhancements.py +2 -1
- claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
- claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +305 -87
- claude_mpm/hooks/claude_hooks/hook_handler.py +106 -89
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
- claude_mpm/hooks/claude_hooks/installer.py +116 -8
- claude_mpm/hooks/claude_hooks/memory_integration.py +51 -31
- claude_mpm/hooks/claude_hooks/response_tracking.py +42 -59
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +39 -24
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +36 -103
- claude_mpm/hooks/claude_hooks/services/state_manager.py +23 -36
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +73 -75
- claude_mpm/hooks/kuzu_memory_hook.py +5 -5
- claude_mpm/hooks/session_resume_hook.py +89 -1
- claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
- claude_mpm/init.py +215 -2
- claude_mpm/scripts/claude-hook-handler.sh +43 -16
- claude_mpm/services/agents/agent_recommendation_service.py +8 -8
- claude_mpm/services/agents/agent_selection_service.py +2 -2
- claude_mpm/services/agents/cache_git_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_discovery_service.py +3 -1
- claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
- claude_mpm/services/agents/deployment/agent_template_builder.py +37 -17
- claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
- claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +36 -8
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +50 -26
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/git_source_manager.py +21 -2
- claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
- claude_mpm/services/agents/single_tier_deployment_service.py +4 -4
- claude_mpm/services/agents/sources/git_source_sync_service.py +116 -5
- claude_mpm/services/agents/startup_sync.py +5 -2
- claude_mpm/services/cli/__init__.py +3 -0
- claude_mpm/services/cli/incremental_pause_manager.py +561 -0
- claude_mpm/services/cli/session_resume_helper.py +10 -2
- claude_mpm/services/delegation_detector.py +175 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +30 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
- claude_mpm/services/diagnostics/models.py +14 -1
- claude_mpm/services/event_log.py +325 -0
- claude_mpm/services/infrastructure/__init__.py +4 -0
- claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
- claude_mpm/services/monitor/daemon_manager.py +15 -4
- claude_mpm/services/monitor/management/lifecycle.py +8 -3
- claude_mpm/services/monitor/server.py +106 -16
- claude_mpm/services/pm_skills_deployer.py +302 -94
- claude_mpm/services/profile_manager.py +10 -4
- claude_mpm/services/skills/git_skill_source_manager.py +192 -29
- claude_mpm/services/skills/selective_skill_deployer.py +211 -46
- claude_mpm/services/skills/skill_discovery_service.py +74 -4
- claude_mpm/services/skills_deployer.py +192 -70
- claude_mpm/services/socketio/handlers/hook.py +14 -7
- claude_mpm/services/socketio/server/main.py +12 -4
- claude_mpm/skills/__init__.py +2 -1
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
- claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
- claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
- claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
- claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
- claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
- claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
- claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
- claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
- claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
- claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
- claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
- claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
- claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
- claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
- claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
- claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
- claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +112 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/registry.py +295 -90
- claude_mpm/skills/skill_manager.py +29 -23
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/utils/agent_dependency_loader.py +103 -4
- claude_mpm/utils/robust_installer.py +45 -24
- claude_mpm-5.6.23.dist-info/METADATA +393 -0
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/RECORD +447 -149
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +0 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +0 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +0 -10
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm-5.4.41.dist-info/METADATA +0 -998
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/WHEEL +0 -0
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/entry_points.txt +0 -0
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.23.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
# TDD Philosophy: Why Order Matters
|
|
2
|
+
|
|
3
|
+
> **Part of**: [Test-Driven Development](../SKILL.md)
|
|
4
|
+
> **Category**: testing
|
|
5
|
+
> **Reading Level**: Advanced
|
|
6
|
+
|
|
7
|
+
## Purpose
|
|
8
|
+
|
|
9
|
+
Deep dive into why test-first development works and why tests-after fundamentally cannot achieve the same benefits, despite appearing similar.
|
|
10
|
+
|
|
11
|
+
## The Core Question
|
|
12
|
+
|
|
13
|
+
**"Why can't I write tests after? I'll still have 100% coverage."**
|
|
14
|
+
|
|
15
|
+
This question misunderstands what TDD provides. Coverage is the least important benefit.
|
|
16
|
+
|
|
17
|
+
## What Tests-First Actually Provides
|
|
18
|
+
|
|
19
|
+
### 1. Design Feedback
|
|
20
|
+
|
|
21
|
+
**Test-First:**
|
|
22
|
+
```typescript
|
|
23
|
+
// Write test first
|
|
24
|
+
test('calculates shipping cost', () => {
|
|
25
|
+
const cost = calculateShipping({ weight: 10, distance: 500 });
|
|
26
|
+
expect(cost).toBe(25);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// Forces you to design a clean API
|
|
30
|
+
// - What parameters does it need?
|
|
31
|
+
// - What does it return?
|
|
32
|
+
// - Is it easy to call?
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Test-After:**
|
|
36
|
+
```typescript
|
|
37
|
+
// Write implementation first
|
|
38
|
+
function calculateShipping(order: Order) {
|
|
39
|
+
const baseRate = config.shipping.baseRate;
|
|
40
|
+
const weightFactor = config.shipping.weightFactor;
|
|
41
|
+
const distanceFactor = config.shipping.distanceFactor;
|
|
42
|
+
const specialHandling = order.items.some(i => i.fragile);
|
|
43
|
+
// ... complex logic
|
|
44
|
+
return cost;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Write test for what you built
|
|
48
|
+
test('calculates shipping cost', () => {
|
|
49
|
+
const order = createComplexOrderObject();
|
|
50
|
+
const cost = calculateShipping(order);
|
|
51
|
+
expect(cost).toBeGreaterThan(0); // Vague assertion
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// Test accepts complex API because implementation already exists
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Outcome:**
|
|
58
|
+
- **Test-First**: Simple, clean API emerged from test
|
|
59
|
+
- **Test-After**: Complex API accepted because changing implementation is "wasteful"
|
|
60
|
+
|
|
61
|
+
### 2. Requirements Verification
|
|
62
|
+
|
|
63
|
+
**Test-First:**
|
|
64
|
+
```typescript
|
|
65
|
+
// Test defines requirement
|
|
66
|
+
test('rejects invalid email format', () => {
|
|
67
|
+
const result = validateEmail('invalid');
|
|
68
|
+
expect(result.valid).toBe(false);
|
|
69
|
+
expect(result.error).toBe('Invalid email format');
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Implementation must satisfy exact requirement
|
|
73
|
+
// Can't "forget" edge cases - test will fail
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Test-After:**
|
|
77
|
+
```typescript
|
|
78
|
+
// Implement based on memory
|
|
79
|
+
function validateEmail(email: string) {
|
|
80
|
+
return email.includes('@'); // Forgot other validations
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Write test for what you remembered to implement
|
|
84
|
+
test('validates email', () => {
|
|
85
|
+
expect(validateEmail('user@example.com')).toBe(true);
|
|
86
|
+
expect(validateEmail('invalid')).toBe(false);
|
|
87
|
+
// Didn't test: multiple @, domain validation, etc.
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Test passes, but incomplete
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Outcome:**
|
|
94
|
+
- **Test-First**: Test drives complete implementation
|
|
95
|
+
- **Test-After**: Test verifies what you remembered
|
|
96
|
+
|
|
97
|
+
### 3. Proof of Test Quality
|
|
98
|
+
|
|
99
|
+
**Test-First:**
|
|
100
|
+
```typescript
|
|
101
|
+
// RED: Write test, watch it fail
|
|
102
|
+
test('retries on failure', async () => {
|
|
103
|
+
const result = await withRetry(failingOperation);
|
|
104
|
+
expect(result).toBe('success');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// RUN: See failure
|
|
108
|
+
// FAIL: withRetry is not defined
|
|
109
|
+
|
|
110
|
+
// You KNOW test works because you saw it fail
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Test-After:**
|
|
114
|
+
```typescript
|
|
115
|
+
// Write implementation
|
|
116
|
+
async function withRetry(fn) {
|
|
117
|
+
try {
|
|
118
|
+
return await fn();
|
|
119
|
+
} catch (e) {
|
|
120
|
+
return await fn();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Write test
|
|
125
|
+
test('retries on failure', async () => {
|
|
126
|
+
const result = await withRetry(succeedingOperation);
|
|
127
|
+
expect(result).toBe('success');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// RUN: Test passes immediately
|
|
131
|
+
// PASS ✓
|
|
132
|
+
|
|
133
|
+
// But test is broken! It never fails, so it tests nothing.
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Outcome:**
|
|
137
|
+
- **Test-First**: Watched fail → know it works
|
|
138
|
+
- **Test-After**: Passes immediately → might be broken
|
|
139
|
+
|
|
140
|
+
## Why "Tests-After Achieve Same Goals" Is Wrong
|
|
141
|
+
|
|
142
|
+
### Claim: "Tests-after give same coverage"
|
|
143
|
+
|
|
144
|
+
**Reality**: Coverage measures lines executed, not correctness verified.
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
// 100% coverage, useless test
|
|
148
|
+
function add(a: number, b: number): number {
|
|
149
|
+
return a - b; // BUG: subtraction instead of addition
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
test('add function', () => {
|
|
153
|
+
add(2, 3); // Executes line = 100% coverage
|
|
154
|
+
// But doesn't verify result!
|
|
155
|
+
});
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Coverage is not quality.**
|
|
159
|
+
|
|
160
|
+
### Claim: "I test all edge cases after implementation"
|
|
161
|
+
|
|
162
|
+
**Reality**: You test edge cases you remember. Test-first discovers edge cases.
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
// Test-first: Edge cases emerge naturally
|
|
166
|
+
|
|
167
|
+
// RED: Basic case
|
|
168
|
+
test('processes single item', () => {
|
|
169
|
+
expect(process([item])).toEqual([processed]);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// GREEN: Implement
|
|
173
|
+
function process(items) {
|
|
174
|
+
return items.map(transform);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// RED: What about empty?
|
|
178
|
+
test('processes empty array', () => {
|
|
179
|
+
expect(process([])).toEqual([]);
|
|
180
|
+
});
|
|
181
|
+
// Forces you to think about edge case
|
|
182
|
+
|
|
183
|
+
// Test-after: Edge cases you remember
|
|
184
|
+
function process(items) {
|
|
185
|
+
return items.map(transform);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
test('processes array', () => {
|
|
189
|
+
expect(process([item])).toEqual([processed]);
|
|
190
|
+
// Forgot empty array - test never forced you to consider it
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Claim: "30 minutes of tests-after is same as TDD"
|
|
195
|
+
|
|
196
|
+
**Reality**: The difference is what happens during those 30 minutes.
|
|
197
|
+
|
|
198
|
+
**Test-First 30 Minutes:**
|
|
199
|
+
1. Write test defining behavior (5 min)
|
|
200
|
+
2. Watch it fail - verify test works (1 min)
|
|
201
|
+
3. Implement to pass test (10 min)
|
|
202
|
+
4. Watch it pass - verify implementation works (1 min)
|
|
203
|
+
5. Refactor safely with tests (8 min)
|
|
204
|
+
6. Next feature (5 min)
|
|
205
|
+
|
|
206
|
+
**Result**: 5 behaviors implemented, all tested, refactored
|
|
207
|
+
|
|
208
|
+
**Test-After 30 Minutes:**
|
|
209
|
+
1. Implement all 5 behaviors (20 min)
|
|
210
|
+
2. Write tests for what you built (10 min)
|
|
211
|
+
3. All tests pass immediately
|
|
212
|
+
4. Hope you didn't forget anything
|
|
213
|
+
|
|
214
|
+
**Result**: 5 behaviors implemented, tests of unknown quality
|
|
215
|
+
|
|
216
|
+
### Claim: "It's about spirit, not ritual"
|
|
217
|
+
|
|
218
|
+
**Reality**: The "spirit" is discovered through the "ritual."
|
|
219
|
+
|
|
220
|
+
The spirit of TDD is:
|
|
221
|
+
- Let tests drive design
|
|
222
|
+
- Verify requirements incrementally
|
|
223
|
+
- Get immediate feedback
|
|
224
|
+
- Build confidence through observation
|
|
225
|
+
|
|
226
|
+
You cannot achieve this spirit without the ritual:
|
|
227
|
+
- Test must fail first (drives design)
|
|
228
|
+
- Implementation must be minimal (incremental)
|
|
229
|
+
- Test must pass after (immediate feedback)
|
|
230
|
+
- You must watch both (builds confidence)
|
|
231
|
+
|
|
232
|
+
**Analogy**: "I understand the spirit of weightlifting, so I'll visualize lifting weights instead of actually lifting them."
|
|
233
|
+
|
|
234
|
+
The spirit emerges from the practice, not from understanding the principles.
|
|
235
|
+
|
|
236
|
+
## The Sunk Cost Fallacy
|
|
237
|
+
|
|
238
|
+
### Situation
|
|
239
|
+
```
|
|
240
|
+
You: "I've already written 500 lines of implementation"
|
|
241
|
+
Partner: "Write tests first, delete that code"
|
|
242
|
+
You: "But I spent 4 hours on it! Deleting is wasteful!"
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Analysis
|
|
246
|
+
|
|
247
|
+
**Time already spent:** 4 hours (GONE, cannot recover)
|
|
248
|
+
|
|
249
|
+
**Option A: Keep it and test after**
|
|
250
|
+
- Time: 4 hours (sunk) + 30 min (tests)
|
|
251
|
+
- Result: Code of unknown quality, weak tests
|
|
252
|
+
- Future: Likely 2-4 hours debugging issues
|
|
253
|
+
- Total: 6.5-8.5 hours
|
|
254
|
+
|
|
255
|
+
**Option B: Delete and TDD**
|
|
256
|
+
- Time: 4 hours (sunk) + 2 hours (TDD rewrite)
|
|
257
|
+
- Result: Clean code, strong tests
|
|
258
|
+
- Future: Minimal debugging
|
|
259
|
+
- Total: 6 hours
|
|
260
|
+
|
|
261
|
+
**Option B is objectively better despite feeling worse.**
|
|
262
|
+
|
|
263
|
+
### Psychological Trap
|
|
264
|
+
|
|
265
|
+
The 4 hours feel "wasted" if you delete code.
|
|
266
|
+
|
|
267
|
+
But:
|
|
268
|
+
- Those 4 hours taught you about the problem
|
|
269
|
+
- Rewrite with TDD will be faster (you understand it now)
|
|
270
|
+
- Quality will be higher
|
|
271
|
+
- You avoid future debugging time
|
|
272
|
+
|
|
273
|
+
**The 4 hours weren't wasted - they were learning.**
|
|
274
|
+
|
|
275
|
+
## The Pragmatism Argument
|
|
276
|
+
|
|
277
|
+
### Claim: "TDD is dogmatic, pragmatism means adapting to situation"
|
|
278
|
+
|
|
279
|
+
**Reality**: TDD IS pragmatic. Tests-after is optimistic gambling.
|
|
280
|
+
|
|
281
|
+
**Pragmatic Question**: Which approach has better ROI?
|
|
282
|
+
|
|
283
|
+
**Test-First:**
|
|
284
|
+
- Time: 30 min (test + implementation)
|
|
285
|
+
- Bugs found: Before commit
|
|
286
|
+
- Debugging time: ~5 min (test tells you exactly what broke)
|
|
287
|
+
- Regression risk: Near zero
|
|
288
|
+
- Refactoring confidence: High
|
|
289
|
+
- Total time: ~35 min
|
|
290
|
+
|
|
291
|
+
**Test-After:**
|
|
292
|
+
- Time: 20 min (implementation) + 10 min (tests)
|
|
293
|
+
- Bugs found: In production (maybe)
|
|
294
|
+
- Debugging time: 60-120 min (investigate what broke)
|
|
295
|
+
- Regression risk: Medium
|
|
296
|
+
- Refactoring confidence: Low
|
|
297
|
+
- Total time: 90-150 min
|
|
298
|
+
|
|
299
|
+
**Which is pragmatic?**
|
|
300
|
+
|
|
301
|
+
### Real-World Data
|
|
302
|
+
|
|
303
|
+
From industry studies and team observations:
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
TDD Projects:
|
|
307
|
+
- 40-80% fewer bugs in production
|
|
308
|
+
- 15-35% more development time upfront
|
|
309
|
+
- 50-90% less debugging time
|
|
310
|
+
- Net: 20-40% less total time
|
|
311
|
+
|
|
312
|
+
Non-TDD Projects:
|
|
313
|
+
- More bugs in production
|
|
314
|
+
- Less development time upfront
|
|
315
|
+
- Significantly more debugging time
|
|
316
|
+
- Net: More total time, lower quality
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**"Pragmatic" shortcuts = long-term waste**
|
|
320
|
+
|
|
321
|
+
## The Manual Testing Trap
|
|
322
|
+
|
|
323
|
+
### Claim: "I already manually tested all edge cases"
|
|
324
|
+
|
|
325
|
+
**Problems:**
|
|
326
|
+
|
|
327
|
+
**1. Manual testing is unreliable**
|
|
328
|
+
```
|
|
329
|
+
You test:
|
|
330
|
+
- Happy path
|
|
331
|
+
- One error case
|
|
332
|
+
- Edge case you thought of
|
|
333
|
+
|
|
334
|
+
You forget:
|
|
335
|
+
- Edge cases you didn't think of
|
|
336
|
+
- Error cases you didn't encounter
|
|
337
|
+
- Combinations of conditions
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
**2. Manual testing doesn't scale**
|
|
341
|
+
```
|
|
342
|
+
Feature A: 5 min manual test
|
|
343
|
+
Feature B: 5 min manual test
|
|
344
|
+
Feature C: 5 min manual test
|
|
345
|
+
|
|
346
|
+
After Feature C:
|
|
347
|
+
To test everything: 15 min
|
|
348
|
+
After Feature Z: 130 min
|
|
349
|
+
After refactoring: 130 min AGAIN
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**3. Manual testing has no record**
|
|
353
|
+
```
|
|
354
|
+
You: "I tested this"
|
|
355
|
+
Later: "Did you test X condition?"
|
|
356
|
+
You: "I think so? Maybe?"
|
|
357
|
+
No proof, must test again
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
**Automated tests:**
|
|
361
|
+
- Run in seconds
|
|
362
|
+
- Test exact same way every time
|
|
363
|
+
- Permanent record of what's tested
|
|
364
|
+
- Run on every change
|
|
365
|
+
|
|
366
|
+
## The "Just This Once" Trap
|
|
367
|
+
|
|
368
|
+
### Pattern
|
|
369
|
+
|
|
370
|
+
```
|
|
371
|
+
Situation 1: "This is simple, skip TDD just this once"
|
|
372
|
+
Situation 2: "This is urgent, skip TDD just this once"
|
|
373
|
+
Situation 3: "This is exploratory, skip TDD just this once"
|
|
374
|
+
Situation 4: "This is a bug fix, skip TDD just this once"
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
**Result**: TDD never happens
|
|
378
|
+
|
|
379
|
+
### Reality Check
|
|
380
|
+
|
|
381
|
+
**Every situation has an excuse:**
|
|
382
|
+
- Simple → "Not worth testing"
|
|
383
|
+
- Complex → "Too hard to test"
|
|
384
|
+
- Urgent → "No time to test"
|
|
385
|
+
- Exploratory → "Will throw away anyway"
|
|
386
|
+
- Bug fix → "Just need quick fix"
|
|
387
|
+
|
|
388
|
+
**All excuses are wrong:**
|
|
389
|
+
- Simple code breaks
|
|
390
|
+
- Complex code NEEDS tests
|
|
391
|
+
- Urgent code needs to be correct
|
|
392
|
+
- Exploration teaches you what to test
|
|
393
|
+
- Bug fixes need regression protection
|
|
394
|
+
|
|
395
|
+
## What Tests-First Actually Feels Like
|
|
396
|
+
|
|
397
|
+
### Common Experience
|
|
398
|
+
|
|
399
|
+
**Week 1-2: Frustrating**
|
|
400
|
+
- Feels slower
|
|
401
|
+
- Fighting the process
|
|
402
|
+
- "Why can't I just write the code?"
|
|
403
|
+
|
|
404
|
+
**Week 3-4: Understanding**
|
|
405
|
+
- Starting to see benefits
|
|
406
|
+
- Tests catch bugs before commit
|
|
407
|
+
- Less debugging time
|
|
408
|
+
|
|
409
|
+
**Week 5+: Natural**
|
|
410
|
+
- Can't imagine coding without tests first
|
|
411
|
+
- Feels faster than old way
|
|
412
|
+
- Confidence in changes
|
|
413
|
+
|
|
414
|
+
### The Shift
|
|
415
|
+
|
|
416
|
+
**Before TDD:**
|
|
417
|
+
```
|
|
418
|
+
Write code → Run → Debug → Fix → Run → Debug → Fix → Done?
|
|
419
|
+
Anxiety: "Did I break anything?"
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
**After TDD:**
|
|
423
|
+
```
|
|
424
|
+
Write test → Watch fail → Write code → Watch pass → Done!
|
|
425
|
+
Confidence: "All tests green = definitely works"
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
## Summary
|
|
429
|
+
|
|
430
|
+
### Tests-First ≠ Tests-After Because:
|
|
431
|
+
|
|
432
|
+
1. **Design**: Test-first drives clean design
|
|
433
|
+
2. **Requirements**: Test-first discovers edge cases
|
|
434
|
+
3. **Proof**: Test-first proves tests work
|
|
435
|
+
4. **Feedback**: Test-first gives immediate feedback
|
|
436
|
+
5. **Confidence**: Test-first builds real confidence
|
|
437
|
+
|
|
438
|
+
### Common Misconceptions:
|
|
439
|
+
|
|
440
|
+
- ✗ "Coverage is the goal" → Quality is the goal
|
|
441
|
+
- ✗ "Tests-after are equivalent" → Fundamentally different
|
|
442
|
+
- ✗ "Deleting code is wasteful" → Sunk cost fallacy
|
|
443
|
+
- ✗ "TDD is dogmatic" → TDD is pragmatic
|
|
444
|
+
- ✗ "Manual testing suffices" → Doesn't scale or persist
|
|
445
|
+
- ✗ "Just this once" → Becomes every time
|
|
446
|
+
|
|
447
|
+
### The Truth:
|
|
448
|
+
|
|
449
|
+
**TDD takes discipline but saves time.**
|
|
450
|
+
**Tests-after feels faster but wastes time.**
|
|
451
|
+
**The only way to understand is to practice TDD properly for 30 days.**
|
|
452
|
+
|
|
453
|
+
## Related References
|
|
454
|
+
|
|
455
|
+
- [Workflow](workflow.md): How to practice TDD
|
|
456
|
+
- [Examples](examples.md): Real-world scenarios
|
|
457
|
+
- [Anti-patterns](anti-patterns.md): Common mistakes
|
|
458
|
+
- [Integration](integration.md): TDD with other skills
|