claude-mpm 4.24.0__py3-none-any.whl → 5.4.41__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/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +3 -48
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +735 -925
- claude_mpm/agents/WORKFLOW.md +5 -254
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +14 -48
- claude_mpm/agents/base_agent.json +7 -4
- claude_mpm/agents/frontmatter_validator.py +71 -3
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +48 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +37 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +180 -31
- claude_mpm/cli/commands/agents.py +1116 -55
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +725 -242
- claude_mpm/cli/commands/config.py +95 -6
- claude_mpm/cli/commands/configure.py +1875 -46
- claude_mpm/cli/commands/configure_agent_display.py +29 -10
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +229 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +286 -6
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +277 -0
- claude_mpm/cli/commands/run.py +123 -165
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +782 -20
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +96 -3
- claude_mpm/cli/interactive/agent_wizard.py +1030 -45
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +307 -10
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +65 -0
- claude_mpm/cli/parsers/config_parser.py +162 -39
- claude_mpm/cli/parsers/profile_parser.py +148 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +146 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +1280 -118
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-config.md +21 -134
- claude_mpm/commands/mpm-doctor.md +16 -20
- claude_mpm/commands/mpm-help.md +13 -283
- claude_mpm/commands/mpm-init.md +88 -489
- claude_mpm/commands/mpm-monitor.md +23 -401
- claude_mpm/commands/mpm-organize.md +72 -247
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +13 -68
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +13 -106
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +13 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +15 -1
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +66 -5
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +91 -10
- claude_mpm/core/logger.py +16 -1
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/optimized_startup.py +59 -0
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DjhvlsAc.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/N4qtv3Hx.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uj46x2Wr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.CAGBuiOw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.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__/installer.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/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +214 -79
- claude_mpm/hooks/claude_hooks/hook_handler.py +155 -1
- claude_mpm/hooks/claude_hooks/installer.py +33 -10
- claude_mpm/hooks/claude_hooks/memory_integration.py +28 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +2 -3
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.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 +30 -6
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/init.py +63 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +60 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/agent_builder.py +48 -12
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +148 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +104 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +238 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +422 -31
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +841 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +663 -0
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/loading/framework_agent_loader.py +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1094 -0
- claude_mpm/services/agents/startup_sync.py +259 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +271 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -4
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +40 -10
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/local_ops/resource_monitor.py +1 -1
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/model/model_router.py +1 -2
- claude_mpm/services/monitor/daemon.py +38 -11
- claude_mpm/services/monitor/daemon_manager.py +134 -21
- claude_mpm/services/monitor/management/lifecycle.py +8 -1
- claude_mpm/services/monitor/server.py +700 -24
- claude_mpm/services/pm_skills_deployer.py +676 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +331 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1297 -0
- claude_mpm/services/skills/selective_skill_deployer.py +704 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1072 -0
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +1 -1
- claude_mpm/services/socketio/server/core.py +387 -112
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skill_manager.py +92 -3
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +91 -12
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +49 -7
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/METADATA +445 -122
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/RECORD +298 -503
- claude_mpm-5.4.41.dist-info/entry_points.txt +5 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.41.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -468
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/base_agent_loader.py +0 -626
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -183
- claude_mpm/agents/templates/circuit_breakers.md +0 -638
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -238
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -144
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -243
- claude_mpm/agents/templates/react_engineer.json +0 -239
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/tauri_engineer.json +0 -274
- claude_mpm/agents/templates/ticketing.json +0 -178
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -159
- claude_mpm/agents/templates/web_qa.json +0 -400
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-detect.md +0 -168
- claude_mpm/commands/mpm-agents-recommend.md +0 -214
- claude_mpm/commands/mpm-agents.md +0 -122
- claude_mpm/commands/mpm-auto-configure.md +0 -269
- claude_mpm/commands/mpm-resume.md +0 -372
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1896
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/socket-client.js +0 -1457
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -419
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -714
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -551
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm-4.24.0.dist-info/entry_points.txt +0 -10
- claude_mpm-4.24.0.dist-info/licenses/LICENSE +0 -21
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/WHEEL +0 -0
- {claude_mpm-4.24.0.dist-info → claude_mpm-5.4.41.dist-info}/top_level.txt +0 -0
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Condition-Based Waiting
|
|
3
|
-
description: Replace arbitrary timeouts with condition polling for reliable async tests
|
|
4
|
-
when_to_use: when tests have race conditions, timing dependencies, or inconsistent pass/fail behavior
|
|
5
|
-
version: 1.1.0
|
|
6
|
-
languages: all
|
|
7
|
-
progressive_disclosure:
|
|
8
|
-
entry_point:
|
|
9
|
-
summary: "Replace arbitrary timeouts with condition polling for reliable async tests"
|
|
10
|
-
when_to_use: "Tests with setTimeout/sleep, flaky tests, or timing-dependent async operations"
|
|
11
|
-
quick_start: |
|
|
12
|
-
1. Identify arbitrary delays in tests (setTimeout, sleep, time.sleep())
|
|
13
|
-
2. Replace with condition-based waiting (waitFor pattern)
|
|
14
|
-
3. Use domain-specific helpers for common scenarios
|
|
15
|
-
See @example.ts for complete working implementation
|
|
16
|
-
core_pattern: |
|
|
17
|
-
// ❌ Guessing at timing
|
|
18
|
-
await new Promise(r => setTimeout(r, 50));
|
|
19
|
-
|
|
20
|
-
// ✅ Waiting for condition
|
|
21
|
-
await waitFor(() => getResult() !== undefined);
|
|
22
|
-
references:
|
|
23
|
-
- path: references/patterns-and-implementation.md
|
|
24
|
-
purpose: Detailed waiting patterns, implementation guide, and common mistakes
|
|
25
|
-
when_to_read: When implementing waitFor or debugging timing issues
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
# Condition-Based Waiting
|
|
29
|
-
|
|
30
|
-
## Overview
|
|
31
|
-
|
|
32
|
-
Flaky tests often guess at timing with arbitrary delays. This creates race conditions where tests pass on fast machines but fail under load or in CI.
|
|
33
|
-
|
|
34
|
-
**Core principle:** Wait for the actual condition you care about, not a guess about how long it takes.
|
|
35
|
-
|
|
36
|
-
## When to Use
|
|
37
|
-
|
|
38
|
-
```dot
|
|
39
|
-
digraph when_to_use {
|
|
40
|
-
"Test uses setTimeout/sleep?" [shape=diamond];
|
|
41
|
-
"Testing timing behavior?" [shape=diamond];
|
|
42
|
-
"Document WHY timeout needed" [shape=box];
|
|
43
|
-
"Use condition-based waiting" [shape=box];
|
|
44
|
-
|
|
45
|
-
"Test uses setTimeout/sleep?" -> "Testing timing behavior?" [label="yes"];
|
|
46
|
-
"Testing timing behavior?" -> "Document WHY timeout needed" [label="yes"];
|
|
47
|
-
"Testing timing behavior?" -> "Use condition-based waiting" [label="no"];
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
**Use when:**
|
|
52
|
-
- Tests have arbitrary delays (`setTimeout`, `sleep`, `time.sleep()`)
|
|
53
|
-
- Tests are flaky (pass sometimes, fail under load)
|
|
54
|
-
- Tests timeout when run in parallel
|
|
55
|
-
- Waiting for async operations to complete
|
|
56
|
-
|
|
57
|
-
**Don't use when:**
|
|
58
|
-
- Testing actual timing behavior (debounce, throttle intervals)
|
|
59
|
-
- Always document WHY if using arbitrary timeout
|
|
60
|
-
|
|
61
|
-
## Core Pattern
|
|
62
|
-
|
|
63
|
-
```typescript
|
|
64
|
-
// ❌ BEFORE: Guessing at timing
|
|
65
|
-
await new Promise(r => setTimeout(r, 50));
|
|
66
|
-
const result = getResult();
|
|
67
|
-
expect(result).toBeDefined();
|
|
68
|
-
|
|
69
|
-
// ✅ AFTER: Waiting for condition
|
|
70
|
-
await waitFor(() => getResult() !== undefined);
|
|
71
|
-
const result = getResult();
|
|
72
|
-
expect(result).toBeDefined();
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
## Quick Patterns
|
|
76
|
-
|
|
77
|
-
| Scenario | Pattern |
|
|
78
|
-
|----------|---------|
|
|
79
|
-
| Wait for event | `waitFor(() => events.find(e => e.type === 'DONE'))` |
|
|
80
|
-
| Wait for state | `waitFor(() => machine.state === 'ready')` |
|
|
81
|
-
| Wait for count | `waitFor(() => items.length >= 5)` |
|
|
82
|
-
| Wait for file | `waitFor(() => fs.existsSync(path))` |
|
|
83
|
-
| Complex condition | `waitFor(() => obj.ready && obj.value > 10)` |
|
|
84
|
-
|
|
85
|
-
## Implementation
|
|
86
|
-
|
|
87
|
-
Generic polling function:
|
|
88
|
-
```typescript
|
|
89
|
-
async function waitFor<T>(
|
|
90
|
-
condition: () => T | undefined | null | false,
|
|
91
|
-
description: string,
|
|
92
|
-
timeoutMs = 5000
|
|
93
|
-
): Promise<T> {
|
|
94
|
-
const startTime = Date.now();
|
|
95
|
-
|
|
96
|
-
while (true) {
|
|
97
|
-
const result = condition();
|
|
98
|
-
if (result) return result;
|
|
99
|
-
|
|
100
|
-
if (Date.now() - startTime > timeoutMs) {
|
|
101
|
-
throw new Error(`Timeout waiting for ${description} after ${timeoutMs}ms`);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
await new Promise(r => setTimeout(r, 10)); // Poll every 10ms
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
See @example.ts for complete implementation with domain-specific helpers (`waitForEvent`, `waitForEventCount`, `waitForEventMatch`).
|
|
110
|
-
|
|
111
|
-
For detailed patterns, implementation guide, and common mistakes, see @references/patterns-and-implementation.md
|
|
112
|
-
|
|
113
|
-
## Real-World Impact
|
|
114
|
-
|
|
115
|
-
From debugging session (2025-10-03):
|
|
116
|
-
- Fixed 15 flaky tests across 3 files
|
|
117
|
-
- Pass rate: 60% → 100%
|
|
118
|
-
- Execution time: 40% faster
|
|
119
|
-
- No more race conditions
|
claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md
DELETED
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
# Detailed Patterns and Implementation Guide
|
|
2
|
-
|
|
3
|
-
This reference provides detailed implementation patterns, common mistakes, and edge cases for condition-based waiting.
|
|
4
|
-
|
|
5
|
-
## Common Mistakes
|
|
6
|
-
|
|
7
|
-
### ❌ Polling too fast
|
|
8
|
-
```typescript
|
|
9
|
-
// BAD: Wastes CPU
|
|
10
|
-
await new Promise(r => setTimeout(r, 1));
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
**✅ Fix:** Poll every 10ms
|
|
14
|
-
```typescript
|
|
15
|
-
await new Promise(r => setTimeout(r, 10)); // Balanced interval
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
### ❌ No timeout
|
|
19
|
-
```typescript
|
|
20
|
-
// BAD: Loop forever if condition never met
|
|
21
|
-
while (true) {
|
|
22
|
-
const result = condition();
|
|
23
|
-
if (result) return result;
|
|
24
|
-
await new Promise(r => setTimeout(r, 10));
|
|
25
|
-
}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
**✅ Fix:** Always include timeout with clear error
|
|
29
|
-
```typescript
|
|
30
|
-
const startTime = Date.now();
|
|
31
|
-
while (true) {
|
|
32
|
-
const result = condition();
|
|
33
|
-
if (result) return result;
|
|
34
|
-
|
|
35
|
-
if (Date.now() - startTime > timeoutMs) {
|
|
36
|
-
throw new Error(`Timeout waiting for ${description} after ${timeoutMs}ms`);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
await new Promise(r => setTimeout(r, 10));
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### ❌ Stale data
|
|
44
|
-
```typescript
|
|
45
|
-
// BAD: Cache state before loop
|
|
46
|
-
const state = machine.getState();
|
|
47
|
-
await waitFor(() => state === 'ready'); // state never updates!
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
**✅ Fix:** Call getter inside loop for fresh data
|
|
51
|
-
```typescript
|
|
52
|
-
await waitFor(() => machine.getState() === 'ready'); // Fresh on each poll
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
## When Arbitrary Timeout IS Correct
|
|
56
|
-
|
|
57
|
-
There are legitimate cases where a fixed timeout is the right approach:
|
|
58
|
-
|
|
59
|
-
```typescript
|
|
60
|
-
// Tool ticks every 100ms - need 2 ticks to verify partial output
|
|
61
|
-
await waitForEvent(manager, 'TOOL_STARTED'); // First: wait for condition
|
|
62
|
-
await new Promise(r => setTimeout(r, 200)); // Then: wait for timed behavior
|
|
63
|
-
// 200ms = 2 ticks at 100ms intervals - documented and justified
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
**Requirements for justified arbitrary timeouts:**
|
|
67
|
-
1. First wait for triggering condition (condition-based wait comes first)
|
|
68
|
-
2. Based on known timing (not guessing - actual system tick rate)
|
|
69
|
-
3. Comment explaining WHY timeout is necessary
|
|
70
|
-
|
|
71
|
-
## Advanced Patterns
|
|
72
|
-
|
|
73
|
-
### Waiting with transformation
|
|
74
|
-
```typescript
|
|
75
|
-
// Wait for event and return transformed data
|
|
76
|
-
const userId = await waitFor(
|
|
77
|
-
() => events.find(e => e.type === 'USER_CREATED')?.data.id,
|
|
78
|
-
'user creation event'
|
|
79
|
-
);
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Waiting with complex conditions
|
|
83
|
-
```typescript
|
|
84
|
-
// Multiple conditions must be met
|
|
85
|
-
await waitFor(
|
|
86
|
-
() => {
|
|
87
|
-
const user = getUser();
|
|
88
|
-
return user?.verified && user?.credits > 0 ? user : undefined;
|
|
89
|
-
},
|
|
90
|
-
'verified user with credits'
|
|
91
|
-
);
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Waiting with side effects
|
|
95
|
-
```typescript
|
|
96
|
-
// Log attempts while waiting
|
|
97
|
-
let attempts = 0;
|
|
98
|
-
await waitFor(
|
|
99
|
-
() => {
|
|
100
|
-
attempts++;
|
|
101
|
-
if (attempts % 10 === 0) {
|
|
102
|
-
console.log(`Still waiting after ${attempts} attempts...`);
|
|
103
|
-
}
|
|
104
|
-
return isReady() || undefined;
|
|
105
|
-
},
|
|
106
|
-
'system ready'
|
|
107
|
-
);
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### Waiting with custom timeouts per condition
|
|
111
|
-
```typescript
|
|
112
|
-
// Different timeouts for different scenarios
|
|
113
|
-
async function waitForDeploy(environment: string) {
|
|
114
|
-
const timeout = environment === 'prod' ? 30000 : 5000;
|
|
115
|
-
return waitFor(
|
|
116
|
-
() => checkDeployStatus(environment),
|
|
117
|
-
`${environment} deployment`,
|
|
118
|
-
timeout
|
|
119
|
-
);
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## Domain-Specific Helpers
|
|
124
|
-
|
|
125
|
-
When you have common waiting scenarios, create domain-specific helpers:
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
// Event-based waiting
|
|
129
|
-
async function waitForEvent(
|
|
130
|
-
manager: EventManager,
|
|
131
|
-
eventType: string,
|
|
132
|
-
timeoutMs = 5000
|
|
133
|
-
) {
|
|
134
|
-
return waitFor(
|
|
135
|
-
() => manager.getEvents().find(e => e.type === eventType),
|
|
136
|
-
`event ${eventType}`,
|
|
137
|
-
timeoutMs
|
|
138
|
-
);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Count-based waiting
|
|
142
|
-
async function waitForEventCount(
|
|
143
|
-
manager: EventManager,
|
|
144
|
-
minCount: number,
|
|
145
|
-
timeoutMs = 5000
|
|
146
|
-
) {
|
|
147
|
-
return waitFor(
|
|
148
|
-
() => {
|
|
149
|
-
const events = manager.getEvents();
|
|
150
|
-
return events.length >= minCount ? events : undefined;
|
|
151
|
-
},
|
|
152
|
-
`at least ${minCount} events`,
|
|
153
|
-
timeoutMs
|
|
154
|
-
);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// Pattern matching waiting
|
|
158
|
-
async function waitForEventMatch(
|
|
159
|
-
manager: EventManager,
|
|
160
|
-
matcher: (event: Event) => boolean,
|
|
161
|
-
timeoutMs = 5000
|
|
162
|
-
) {
|
|
163
|
-
return waitFor(
|
|
164
|
-
() => manager.getEvents().find(matcher),
|
|
165
|
-
'event matching predicate',
|
|
166
|
-
timeoutMs
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
See @example.ts for complete working implementations from real debugging session.
|
|
172
|
-
|
|
173
|
-
## Debugging Tips
|
|
174
|
-
|
|
175
|
-
### Add descriptive error messages
|
|
176
|
-
```typescript
|
|
177
|
-
// GOOD: Clear what failed
|
|
178
|
-
await waitFor(
|
|
179
|
-
() => orders.find(o => o.status === 'SHIPPED'),
|
|
180
|
-
'order to be shipped',
|
|
181
|
-
5000
|
|
182
|
-
);
|
|
183
|
-
// Error: "Timeout waiting for order to be shipped after 5000ms"
|
|
184
|
-
|
|
185
|
-
// BETTER: Include context
|
|
186
|
-
await waitFor(
|
|
187
|
-
() => orders.find(o => o.id === orderId && o.status === 'SHIPPED'),
|
|
188
|
-
`order ${orderId} to be shipped`,
|
|
189
|
-
5000
|
|
190
|
-
);
|
|
191
|
-
// Error: "Timeout waiting for order abc-123 to be shipped after 5000ms"
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### Log current state on timeout
|
|
195
|
-
```typescript
|
|
196
|
-
async function waitForWithDebug<T>(
|
|
197
|
-
condition: () => T | undefined | null | false,
|
|
198
|
-
description: string,
|
|
199
|
-
getCurrentState: () => any,
|
|
200
|
-
timeoutMs = 5000
|
|
201
|
-
): Promise<T> {
|
|
202
|
-
const startTime = Date.now();
|
|
203
|
-
|
|
204
|
-
while (true) {
|
|
205
|
-
const result = condition();
|
|
206
|
-
if (result) return result;
|
|
207
|
-
|
|
208
|
-
if (Date.now() - startTime > timeoutMs) {
|
|
209
|
-
const state = getCurrentState();
|
|
210
|
-
throw new Error(
|
|
211
|
-
`Timeout waiting for ${description} after ${timeoutMs}ms. ` +
|
|
212
|
-
`Current state: ${JSON.stringify(state)}`
|
|
213
|
-
);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
await new Promise(r => setTimeout(r, 10));
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
## Performance Considerations
|
|
222
|
-
|
|
223
|
-
### Poll interval trade-offs
|
|
224
|
-
- **1ms**: Too fast, wastes CPU (10,000 checks/second)
|
|
225
|
-
- **10ms**: Good default, responsive (100 checks/second)
|
|
226
|
-
- **50ms**: Acceptable for slow operations (20 checks/second)
|
|
227
|
-
- **100ms+**: Only for very slow operations or known timing
|
|
228
|
-
|
|
229
|
-
### Choose appropriate timeout values
|
|
230
|
-
```typescript
|
|
231
|
-
// Fast operations - short timeout
|
|
232
|
-
await waitFor(() => cache.get(key), 'cache hit', 1000);
|
|
233
|
-
|
|
234
|
-
// Network operations - medium timeout
|
|
235
|
-
await waitFor(() => fetchStatus(), 'API response', 5000);
|
|
236
|
-
|
|
237
|
-
// External systems - long timeout
|
|
238
|
-
await waitFor(() => checkDeployment(), 'deployment complete', 30000);
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
### Avoid expensive condition checks
|
|
242
|
-
```typescript
|
|
243
|
-
// BAD: Expensive regex on every poll
|
|
244
|
-
await waitFor(() => /complex.*regex.*pattern/.test(getLargeString()), ...);
|
|
245
|
-
|
|
246
|
-
// GOOD: Cache expensive computations
|
|
247
|
-
let parsed;
|
|
248
|
-
await waitFor(() => {
|
|
249
|
-
const str = getString();
|
|
250
|
-
parsed = parsed || expensiveParse(str);
|
|
251
|
-
return parsed.isReady;
|
|
252
|
-
}, ...);
|
|
253
|
-
```
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: test-driven-development
|
|
3
|
-
description: Write the test first, watch it fail, write minimal code to pass
|
|
4
|
-
version: 3.2.0
|
|
5
|
-
category: testing
|
|
6
|
-
author: Jesse Vincent
|
|
7
|
-
license: MIT
|
|
8
|
-
source: https://github.com/obra/superpowers-skills/tree/main/skills/testing/test-driven-development
|
|
9
|
-
progressive_disclosure:
|
|
10
|
-
entry_point:
|
|
11
|
-
summary: "Enforce test-first development with strict RED/GREEN/REFACTOR cycle. Never write implementation before failing test."
|
|
12
|
-
when_to_use: "When implementing any feature or bugfix, before writing implementation code. Always for new features, bug fixes, refactoring, and behavior changes."
|
|
13
|
-
quick_start: "1. Write failing test 2. Watch it fail (verify) 3. Write minimal code to pass 4. Watch it pass (verify) 5. Refactor if needed 6. Repeat"
|
|
14
|
-
references:
|
|
15
|
-
- workflow.md
|
|
16
|
-
- examples.md
|
|
17
|
-
- philosophy.md
|
|
18
|
-
- anti-patterns.md
|
|
19
|
-
- integration.md
|
|
20
|
-
context_limit: 800
|
|
21
|
-
tags:
|
|
22
|
-
- tdd
|
|
23
|
-
- testing
|
|
24
|
-
- red-green-refactor
|
|
25
|
-
- test-first
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
# Test-Driven Development (TDD)
|
|
29
|
-
|
|
30
|
-
## Overview
|
|
31
|
-
|
|
32
|
-
Write the test first. Watch it fail. Write minimal code to pass.
|
|
33
|
-
|
|
34
|
-
**Core principle:** If you didn't watch the test fail, you don't know if it tests the right thing.
|
|
35
|
-
|
|
36
|
-
This skill enforces strict test-first development following the RED/GREEN/REFACTOR cycle. Violating the letter of the rules is violating the spirit of the rules.
|
|
37
|
-
|
|
38
|
-
## When to Use This Skill
|
|
39
|
-
|
|
40
|
-
**Always:**
|
|
41
|
-
- New features
|
|
42
|
-
- Bug fixes
|
|
43
|
-
- Refactoring
|
|
44
|
-
- Behavior changes
|
|
45
|
-
|
|
46
|
-
**Exceptions (ask human partner):**
|
|
47
|
-
- Throwaway prototypes
|
|
48
|
-
- Generated code
|
|
49
|
-
- Configuration files
|
|
50
|
-
|
|
51
|
-
Thinking "skip TDD just this once"? Stop. That's rationalization.
|
|
52
|
-
|
|
53
|
-
## The Iron Law
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
Write code before the test? Delete it. Start over.
|
|
60
|
-
|
|
61
|
-
**No exceptions:**
|
|
62
|
-
- Don't keep it as "reference"
|
|
63
|
-
- Don't "adapt" it while writing tests
|
|
64
|
-
- Delete means delete
|
|
65
|
-
|
|
66
|
-
## Core Principles
|
|
67
|
-
|
|
68
|
-
1. **RED**: Write a failing test first
|
|
69
|
-
2. **GREEN**: Write minimal code to make test pass
|
|
70
|
-
3. **REFACTOR**: Improve code while keeping tests green
|
|
71
|
-
4. **NEVER**: Write implementation before tests
|
|
72
|
-
|
|
73
|
-
## Quick Start
|
|
74
|
-
|
|
75
|
-
### The RED/GREEN/REFACTOR Cycle
|
|
76
|
-
|
|
77
|
-
```
|
|
78
|
-
RED → Verify RED → GREEN → Verify GREEN → REFACTOR → Repeat
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
1. **RED**: Write one minimal test showing desired behavior
|
|
82
|
-
2. **Verify RED**: Run test, confirm it fails for right reason
|
|
83
|
-
3. **GREEN**: Write simplest code to pass test
|
|
84
|
-
4. **Verify GREEN**: Run test, confirm it passes
|
|
85
|
-
5. **REFACTOR**: Clean up while keeping tests green
|
|
86
|
-
6. **Repeat**: Next test for next feature
|
|
87
|
-
|
|
88
|
-
## Cycle Details
|
|
89
|
-
|
|
90
|
-
**RED**: Write one minimal test (one behavior, clear name, real code)
|
|
91
|
-
**Verify RED**: MANDATORY - watch it fail for right reason
|
|
92
|
-
**GREEN**: Write simplest code to pass (no extras)
|
|
93
|
-
**Verify GREEN**: MANDATORY - watch it pass, all tests pass
|
|
94
|
-
**REFACTOR**: Clean up while keeping tests green (optional)
|
|
95
|
-
|
|
96
|
-
## Navigation
|
|
97
|
-
|
|
98
|
-
For detailed information:
|
|
99
|
-
- **[Workflow](references/workflow.md)**: Complete RED/GREEN/REFACTOR workflow with detailed examples
|
|
100
|
-
- **[Examples](references/examples.md)**: Real-world TDD scenarios with step-by-step walkthroughs
|
|
101
|
-
- **[Philosophy](references/philosophy.md)**: Why order matters and why tests-after don't work
|
|
102
|
-
- **[Anti-patterns](references/anti-patterns.md)**: Common mistakes, rationalizations, and red flags
|
|
103
|
-
- **[Integration](references/integration.md)**: Using TDD with debugging and other skills
|
|
104
|
-
|
|
105
|
-
## Key Reminders
|
|
106
|
-
|
|
107
|
-
- ALWAYS write the test BEFORE implementation
|
|
108
|
-
- Make each test fail FIRST to verify it's testing something
|
|
109
|
-
- Keep implementation minimal - just enough to pass tests
|
|
110
|
-
- Refactor only when tests are green
|
|
111
|
-
- One cycle at a time - small steps
|
|
112
|
-
- If test passes immediately, it's not testing new behavior
|
|
113
|
-
|
|
114
|
-
## Red Flags - STOP and Start Over
|
|
115
|
-
|
|
116
|
-
If you catch yourself:
|
|
117
|
-
- Writing code before test
|
|
118
|
-
- Test passes immediately
|
|
119
|
-
- Can't explain why test failed
|
|
120
|
-
- "I'll test after"
|
|
121
|
-
- "Keep as reference"
|
|
122
|
-
- "Already spent X hours, deleting is wasteful"
|
|
123
|
-
- "Tests after achieve the same purpose"
|
|
124
|
-
|
|
125
|
-
**ALL of these mean: Delete code. Start over with TDD.**
|
|
126
|
-
|
|
127
|
-
## Why Order Matters
|
|
128
|
-
|
|
129
|
-
Tests-after pass immediately (proves nothing), test-first fail then pass (proves it works). See [Philosophy](references/philosophy.md) for detailed explanation.
|
|
130
|
-
|
|
131
|
-
## Integration with Other Skills
|
|
132
|
-
|
|
133
|
-
- **systematic-debugging**: Create failing test in Phase 4 (bug reproduction)
|
|
134
|
-
- **verification-before-completion**: Verify tests exist and watched them fail
|
|
135
|
-
- **defense-in-depth**: Add validation tests after implementing feature
|
|
136
|
-
|
|
137
|
-
## Real-World Impact
|
|
138
|
-
|
|
139
|
-
From TDD practice:
|
|
140
|
-
- Test-first: 95%+ first-time correctness
|
|
141
|
-
- Test-after: 40% first-time correctness
|
|
142
|
-
- TDD time: 25-45 minutes per feature (including tests)
|
|
143
|
-
- Non-TDD time: 15 minutes coding + 60-120 minutes debugging
|
|
144
|
-
|
|
145
|
-
**TDD is pragmatic** - finds bugs before commit, prevents regressions, documents behavior, enables refactoring.
|