claude-mpm 5.0.9__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/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +115 -0
- claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +479 -616
- claude_mpm/agents/WORKFLOW.md +6 -253
- claude_mpm/agents/agent_loader.py +13 -44
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/frontmatter_validator.py +70 -2
- claude_mpm/agents/templates/circuit-breakers.md +457 -62
- claude_mpm/cli/__init__.py +5 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/agent_state_manager.py +18 -27
- claude_mpm/cli/commands/agents.py +177 -41
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/auto_configure.py +723 -236
- claude_mpm/cli/commands/autotodos.py +566 -0
- claude_mpm/cli/commands/commander.py +216 -0
- claude_mpm/cli/commands/config.py +88 -2
- claude_mpm/cli/commands/configure.py +1874 -170
- claude_mpm/cli/commands/configure_agent_display.py +27 -6
- 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 +232 -46
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
- claude_mpm/cli/commands/postmortem.py +1 -1
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +35 -3
- claude_mpm/cli/commands/skill_source.py +51 -2
- claude_mpm/cli/commands/skills.py +379 -204
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +141 -19
- claude_mpm/cli/interactive/__init__.py +10 -0
- claude_mpm/cli/interactive/agent_wizard.py +115 -60
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/parsers/agents_parser.py +54 -9
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +88 -1
- claude_mpm/cli/parsers/commander_parser.py +116 -0
- claude_mpm/cli/parsers/config_parser.py +153 -83
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- 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 +1 -1
- claude_mpm/cli/startup.py +1017 -266
- 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 +36 -0
- claude_mpm/commands/mpm-doctor.md +16 -21
- claude_mpm/commands/mpm-help.md +12 -286
- claude_mpm/commands/mpm-init.md +88 -506
- claude_mpm/commands/mpm-monitor.md +22 -401
- claude_mpm/commands/mpm-organize.md +128 -0
- claude_mpm/commands/mpm-postmortem.md +13 -107
- claude_mpm/commands/mpm-session-resume.md +20 -363
- claude_mpm/commands/mpm-status.md +13 -69
- claude_mpm/commands/mpm-ticket-view.md +60 -495
- claude_mpm/commands/mpm-version.md +13 -107
- claude_mpm/commands/mpm.md +8 -0
- claude_mpm/config/agent_presets.py +8 -7
- claude_mpm/config/agent_sources.py +27 -0
- 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 +37 -26
- claude_mpm/core/config_constants.py +74 -9
- claude_mpm/core/constants.py +56 -12
- 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/instruction_loader.py +52 -11
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_manager.py +51 -3
- claude_mpm/core/interactive_session.py +12 -11
- claude_mpm/core/logger.py +39 -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 +61 -0
- claude_mpm/core/output_style_manager.py +219 -44
- claude_mpm/core/shared/config_loader.py +3 -1
- claude_mpm/core/socketio_pool.py +16 -8
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +76 -8
- claude_mpm/core/unified_paths.py +95 -90
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- 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/BSNlmTZj.js +1 -0
- 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/DR8nis88.js +2 -0
- 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/NqQ1dWOy.js +1 -0
- 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.RgBboRvH.js +1 -0
- 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 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- 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__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.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__/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/auto_pause_handler.py +485 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +479 -128
- claude_mpm/hooks/claude_hooks/hook_handler.py +254 -83
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
- claude_mpm/hooks/claude_hooks/installer.py +149 -18
- claude_mpm/hooks/claude_hooks/memory_integration.py +67 -19
- claude_mpm/hooks/claude_hooks/response_tracking.py +44 -62
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.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 +69 -30
- 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/memory_integration_hook.py +46 -1
- claude_mpm/hooks/session_resume_hook.py +89 -1
- claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
- claude_mpm/init.py +276 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +3 -3
- claude_mpm/scripts/claude-hook-handler.sh +87 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +0 -0
- claude_mpm/services/agents/agent_builder.py +3 -3
- 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 +2 -2
- claude_mpm/services/agents/cache_git_manager.py +7 -7
- claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
- claude_mpm/services/agents/deployment/agent_discovery_service.py +6 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
- claude_mpm/services/agents/deployment/agent_template_builder.py +42 -20
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
- 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 +348 -29
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +570 -68
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/git_source_manager.py +57 -4
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +6 -6
- claude_mpm/services/agents/sources/git_source_sync_service.py +129 -11
- claude_mpm/services/agents/startup_sync.py +27 -4
- claude_mpm/services/agents/toolchain_detector.py +10 -6
- claude_mpm/services/analysis/__init__.py +11 -1
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- 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/command_deployment_service.py +81 -10
- claude_mpm/services/delegation_detector.py +175 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +31 -1
- 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_bus/config.py +3 -1
- claude_mpm/services/event_log.py +325 -0
- claude_mpm/services/git/git_operations_service.py +101 -16
- 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.py +9 -2
- claude_mpm/services/monitor/daemon_manager.py +54 -7
- claude_mpm/services/monitor/management/lifecycle.py +15 -3
- claude_mpm/services/monitor/server.py +796 -30
- claude_mpm/services/pm_skills_deployer.py +884 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/skills/__init__.py +3 -0
- claude_mpm/services/skills/git_skill_source_manager.py +303 -12
- claude_mpm/services/skills/selective_skill_deployer.py +869 -0
- claude_mpm/services/skills/skill_discovery_service.py +74 -4
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_deployer.py +294 -55
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/hook.py +14 -7
- claude_mpm/services/socketio/server/core.py +386 -108
- claude_mpm/services/socketio/server/main.py +12 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- 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 +98 -3
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/utils/agent_dependency_loader.py +115 -4
- claude_mpm/utils/agent_filters.py +17 -44
- claude_mpm/utils/gitignore.py +3 -0
- claude_mpm/utils/migration.py +4 -4
- claude_mpm/utils/robust_installer.py +86 -21
- claude_mpm-5.6.23.dist-info/METADATA +393 -0
- {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/RECORD +508 -261
- claude_mpm-5.6.23.dist-info/entry_points.txt +5 -0
- claude_mpm-5.6.23.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.6.23.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 -480
- 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/OUTPUT_STYLE.md +0 -290
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +0 -1322
- claude_mpm/agents/base_agent_loader.py +0 -601
- 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-auto-configure.md +0 -278
- claude_mpm/commands/mpm-agents-detect.md +0 -177
- claude_mpm/commands/mpm-agents-list.md +0 -131
- claude_mpm/commands/mpm-agents-recommend.md +0 -223
- claude_mpm/commands/mpm-config-view.md +0 -150
- claude_mpm/commands/mpm-ticket-organize.md +0 -304
- 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/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/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 -1914
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/socket-client.js +0 -1474
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- 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/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- 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 -977
- 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 -414
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
- 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 -555
- 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-5.0.9.dist-info/METADATA +0 -1028
- claude_mpm-5.0.9.dist-info/entry_points.txt +0 -10
- claude_mpm-5.0.9.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/WHEEL +0 -0
- {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
# Assertion Quality Guide
|
|
2
|
+
|
|
3
|
+
## Assertion Strength Spectrum
|
|
4
|
+
|
|
5
|
+
### Level 1: Worthless (Don't use)
|
|
6
|
+
```python
|
|
7
|
+
assert result # Always passes unless None/False
|
|
8
|
+
assert x # Meaningless
|
|
9
|
+
assert True # Always passes
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
**Problem:** These pass even when functionality is completely broken.
|
|
13
|
+
|
|
14
|
+
### Level 2: Existence Only (Very weak)
|
|
15
|
+
```python
|
|
16
|
+
assert result is not None
|
|
17
|
+
assert len(items) > 0
|
|
18
|
+
assert user
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Problem:** Verifies something exists, not that it's correct.
|
|
22
|
+
|
|
23
|
+
**When acceptable:** As a precondition before stronger assertions.
|
|
24
|
+
|
|
25
|
+
### Level 3: Type Checking (Weak)
|
|
26
|
+
```python
|
|
27
|
+
assert isinstance(result, dict)
|
|
28
|
+
assert type(user) == User
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Problem:** Right type, but could be garbage data.
|
|
32
|
+
|
|
33
|
+
**When acceptable:** Combined with value assertions.
|
|
34
|
+
|
|
35
|
+
### Level 4: Property Existence (Moderate)
|
|
36
|
+
```python
|
|
37
|
+
assert 'email' in user
|
|
38
|
+
assert hasattr(response, 'status_code')
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Problem:** Property exists but could have wrong value.
|
|
42
|
+
|
|
43
|
+
**When acceptable:** When structure matters more than values.
|
|
44
|
+
|
|
45
|
+
### Level 5: Value Verification (Strong)
|
|
46
|
+
```python
|
|
47
|
+
assert user.email == "test@example.com"
|
|
48
|
+
assert response.status_code == 200
|
|
49
|
+
assert len(items) == 5
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Good:** Verifies specific correctness.
|
|
53
|
+
|
|
54
|
+
**Still missing:** Failure cases, edge conditions.
|
|
55
|
+
|
|
56
|
+
### Level 6: Complete Verification (Strongest)
|
|
57
|
+
```python
|
|
58
|
+
# Success case
|
|
59
|
+
assert user.email == "test@example.com"
|
|
60
|
+
assert user.is_active is True
|
|
61
|
+
assert user.created_at <= datetime.now()
|
|
62
|
+
|
|
63
|
+
# Failure case
|
|
64
|
+
with pytest.raises(ValidationError) as exc:
|
|
65
|
+
create_user("invalid-email")
|
|
66
|
+
assert "Invalid email format" in str(exc.value)
|
|
67
|
+
|
|
68
|
+
# Side effects
|
|
69
|
+
assert User.count() == initial_count + 1
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Best:** Verifies correctness AND failure modes AND side effects.
|
|
73
|
+
|
|
74
|
+
## Assertion Patterns
|
|
75
|
+
|
|
76
|
+
### Pattern 1: Value Assertions
|
|
77
|
+
|
|
78
|
+
#### Bad: Existence Only
|
|
79
|
+
```python
|
|
80
|
+
def test_user_creation():
|
|
81
|
+
user = create_user("test@example.com", "password")
|
|
82
|
+
assert user # Weak!
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
#### Good: Specific Values
|
|
86
|
+
```python
|
|
87
|
+
def test_user_creation_sets_correct_attributes():
|
|
88
|
+
user = create_user("test@example.com", "password123")
|
|
89
|
+
|
|
90
|
+
assert user.email == "test@example.com"
|
|
91
|
+
assert user.is_active is True
|
|
92
|
+
assert user.role == "user"
|
|
93
|
+
assert user.created_at is not None
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Pattern 2: Collection Assertions
|
|
97
|
+
|
|
98
|
+
#### Bad: Count Only
|
|
99
|
+
```python
|
|
100
|
+
def test_get_users():
|
|
101
|
+
users = get_all_users()
|
|
102
|
+
assert len(users) > 0 # Weak!
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
#### Good: Content Verification
|
|
106
|
+
```python
|
|
107
|
+
def test_get_users_returns_all_active_users():
|
|
108
|
+
create_user("user1@example.com")
|
|
109
|
+
create_user("user2@example.com")
|
|
110
|
+
create_inactive_user("inactive@example.com")
|
|
111
|
+
|
|
112
|
+
users = get_all_users()
|
|
113
|
+
|
|
114
|
+
assert len(users) == 2
|
|
115
|
+
emails = [u.email for u in users]
|
|
116
|
+
assert "user1@example.com" in emails
|
|
117
|
+
assert "user2@example.com" in emails
|
|
118
|
+
assert "inactive@example.com" not in emails
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Pattern 3: Error Assertions
|
|
122
|
+
|
|
123
|
+
#### Bad: Generic Exception
|
|
124
|
+
```python
|
|
125
|
+
def test_invalid_input():
|
|
126
|
+
try:
|
|
127
|
+
process_data(None)
|
|
128
|
+
assert False, "Should have raised"
|
|
129
|
+
except Exception:
|
|
130
|
+
pass # Too generic!
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
#### Good: Specific Error with Message
|
|
134
|
+
```python
|
|
135
|
+
def test_process_data_with_none_raises_validation_error():
|
|
136
|
+
with pytest.raises(ValidationError) as exc:
|
|
137
|
+
process_data(None)
|
|
138
|
+
|
|
139
|
+
assert "Data cannot be None" in str(exc.value)
|
|
140
|
+
assert exc.value.field == "data"
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Pattern 4: State Change Assertions
|
|
144
|
+
|
|
145
|
+
#### Bad: No Before/After Check
|
|
146
|
+
```python
|
|
147
|
+
def test_update_user():
|
|
148
|
+
user = get_user(1)
|
|
149
|
+
update_user(1, email="new@example.com")
|
|
150
|
+
# No verification of actual change!
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
#### Good: Verify State Transition
|
|
154
|
+
```python
|
|
155
|
+
def test_update_user_email_changes_email_field():
|
|
156
|
+
user = create_user("old@example.com")
|
|
157
|
+
original_email = user.email
|
|
158
|
+
|
|
159
|
+
update_user(user.id, email="new@example.com")
|
|
160
|
+
updated_user = get_user(user.id)
|
|
161
|
+
|
|
162
|
+
assert updated_user.email == "new@example.com"
|
|
163
|
+
assert updated_user.email != original_email
|
|
164
|
+
assert updated_user.id == user.id # Same user
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Pattern 5: API Response Assertions
|
|
168
|
+
|
|
169
|
+
#### Bad: Status Code Only
|
|
170
|
+
```python
|
|
171
|
+
def test_api_endpoint():
|
|
172
|
+
response = client.get("/api/users")
|
|
173
|
+
assert response.status_code == 200 # Weak!
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
#### Good: Complete Response Verification
|
|
177
|
+
```python
|
|
178
|
+
def test_get_users_endpoint_returns_user_list():
|
|
179
|
+
create_user("test1@example.com")
|
|
180
|
+
create_user("test2@example.com")
|
|
181
|
+
|
|
182
|
+
response = client.get("/api/users")
|
|
183
|
+
|
|
184
|
+
assert response.status_code == 200
|
|
185
|
+
assert response.headers["Content-Type"] == "application/json"
|
|
186
|
+
|
|
187
|
+
data = response.json()
|
|
188
|
+
assert "users" in data
|
|
189
|
+
assert len(data["users"]) == 2
|
|
190
|
+
assert data["users"][0]["email"] == "test1@example.com"
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Assertion Anti-Patterns
|
|
194
|
+
|
|
195
|
+
### Anti-Pattern 1: Testing Mock Behavior
|
|
196
|
+
```python
|
|
197
|
+
# BAD
|
|
198
|
+
def test_send_email():
|
|
199
|
+
mock_mailer = Mock()
|
|
200
|
+
send_email(mock_mailer, "test@example.com", "Hello")
|
|
201
|
+
assert mock_mailer.send.called # Testing mock!
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**Fix:** Test real behavior or use test doubles that verify contracts.
|
|
205
|
+
|
|
206
|
+
### Anti-Pattern 2: Asserting Implementation Details
|
|
207
|
+
```python
|
|
208
|
+
# BAD
|
|
209
|
+
def test_password_hashing():
|
|
210
|
+
user = User("test", "password")
|
|
211
|
+
assert user._hash_algorithm == "bcrypt" # Implementation detail!
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Fix:** Test behavior (password verification works) not implementation.
|
|
215
|
+
|
|
216
|
+
### Anti-Pattern 3: Multiple Concepts in One Assert
|
|
217
|
+
```python
|
|
218
|
+
# BAD
|
|
219
|
+
def test_user_and_profile():
|
|
220
|
+
result = create_user_with_profile(...)
|
|
221
|
+
assert result.user and result.profile # Too vague!
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**Fix:** Separate assertions for each concept.
|
|
225
|
+
|
|
226
|
+
### Anti-Pattern 4: Overly Lenient Assertions
|
|
227
|
+
```python
|
|
228
|
+
# BAD
|
|
229
|
+
def test_calculate_total():
|
|
230
|
+
total = calculate_total([1, 2, 3])
|
|
231
|
+
assert total > 0 # Way too lenient!
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Fix:** Assert exact expected value.
|
|
235
|
+
|
|
236
|
+
## Assertion Best Practices
|
|
237
|
+
|
|
238
|
+
### 1. One Concept Per Assertion
|
|
239
|
+
```python
|
|
240
|
+
# Good: Clear what's being verified
|
|
241
|
+
assert user.email == expected_email
|
|
242
|
+
assert user.is_active is True
|
|
243
|
+
assert user.created_at is not None
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### 2. Meaningful Failure Messages
|
|
247
|
+
```python
|
|
248
|
+
# Good: Helpful when test fails
|
|
249
|
+
assert user.age >= 18, f"User age {user.age} is below minimum 18"
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### 3. Assert Actual vs Expected
|
|
253
|
+
```python
|
|
254
|
+
# Good: Clear which is which
|
|
255
|
+
assert actual == expected # Convention: actual first
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### 4. Test Both Paths
|
|
259
|
+
```python
|
|
260
|
+
# Good: Success and failure
|
|
261
|
+
def test_valid_login_succeeds():
|
|
262
|
+
assert login("user", "pass").success is True
|
|
263
|
+
|
|
264
|
+
def test_invalid_login_fails():
|
|
265
|
+
assert login("user", "wrong").success is False
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### 5. Verify Side Effects
|
|
269
|
+
```python
|
|
270
|
+
# Good: Check state changes
|
|
271
|
+
def test_delete_user_removes_from_database():
|
|
272
|
+
user = create_user("test@example.com")
|
|
273
|
+
initial_count = User.count()
|
|
274
|
+
|
|
275
|
+
delete_user(user.id)
|
|
276
|
+
|
|
277
|
+
assert User.count() == initial_count - 1
|
|
278
|
+
assert User.get(user.id) is None
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## Assertion Checklist
|
|
282
|
+
|
|
283
|
+
For each assertion, ask:
|
|
284
|
+
|
|
285
|
+
- [ ] **Specificity**: Is this assertion specific enough?
|
|
286
|
+
- [ ] **Meaningfulness**: Would this fail if functionality breaks?
|
|
287
|
+
- [ ] **Completeness**: Are all aspects verified?
|
|
288
|
+
- [ ] **Clarity**: Is it obvious what's being tested?
|
|
289
|
+
- [ ] **Failure Messages**: Will I know why it failed?
|
|
290
|
+
|
|
291
|
+
## Quick Reference
|
|
292
|
+
|
|
293
|
+
### Strong Assertions ✅
|
|
294
|
+
```python
|
|
295
|
+
assert actual == expected_value
|
|
296
|
+
assert result.field == specific_value
|
|
297
|
+
assert len(collection) == expected_count
|
|
298
|
+
assert "expected text" in result.message
|
|
299
|
+
with pytest.raises(SpecificError):
|
|
300
|
+
dangerous_operation()
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Weak Assertions ❌
|
|
304
|
+
```python
|
|
305
|
+
assert result
|
|
306
|
+
assert result is not None
|
|
307
|
+
assert len(collection) > 0
|
|
308
|
+
assert True
|
|
309
|
+
assert mock.called
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Remember
|
|
313
|
+
|
|
314
|
+
> "An assertion that would pass with broken code is not an assertion."
|
|
315
|
+
> "Weak assertions create false confidence."
|
|
316
|
+
> "Test behavior, not implementation."
|
|
317
|
+
> "Verify correctness, not just existence."
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
# Test Inspection Checklist
|
|
2
|
+
|
|
3
|
+
## Quick Inspection (2 minutes per test)
|
|
4
|
+
|
|
5
|
+
### Intent Check
|
|
6
|
+
- [ ] Test name describes behavior, not method
|
|
7
|
+
- [ ] Expected behavior is stated
|
|
8
|
+
- [ ] Single clear purpose
|
|
9
|
+
|
|
10
|
+
### Assertion Check
|
|
11
|
+
- [ ] Assertions match intent
|
|
12
|
+
- [ ] Specific values, not just "not None"
|
|
13
|
+
- [ ] Would catch regressions
|
|
14
|
+
|
|
15
|
+
### Failure Check
|
|
16
|
+
- [ ] Error cases tested
|
|
17
|
+
- [ ] Would fail if feature removed
|
|
18
|
+
- [ ] Meaningful failure messages
|
|
19
|
+
|
|
20
|
+
## Deep Inspection (5-10 minutes per test)
|
|
21
|
+
|
|
22
|
+
### 1. Intent Analysis
|
|
23
|
+
```
|
|
24
|
+
Question: What is this test supposed to verify?
|
|
25
|
+
|
|
26
|
+
Checklist:
|
|
27
|
+
[ ] Test name clearly states behavior
|
|
28
|
+
[ ] Docstring explains expected outcome
|
|
29
|
+
[ ] Setup reflects realistic scenario
|
|
30
|
+
[ ] Test has single responsibility
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Red Flags:**
|
|
34
|
+
- "test_method_name" (tests method, not behavior)
|
|
35
|
+
- "test_user" (too vague)
|
|
36
|
+
- "test_works" (what does "works" mean?)
|
|
37
|
+
|
|
38
|
+
### 2. Setup Quality
|
|
39
|
+
```
|
|
40
|
+
Question: Is the setup realistic and complete?
|
|
41
|
+
|
|
42
|
+
Checklist:
|
|
43
|
+
[ ] Test data matches production patterns
|
|
44
|
+
[ ] All dependencies are initialized
|
|
45
|
+
[ ] State is valid and achievable
|
|
46
|
+
[ ] Mocks are justified and complete
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Red Flags:**
|
|
50
|
+
- Mock data that would never occur
|
|
51
|
+
- Missing required fields
|
|
52
|
+
- Bypassing normal constraints
|
|
53
|
+
- Over-simplified scenarios
|
|
54
|
+
|
|
55
|
+
### 3. Execution Verification
|
|
56
|
+
```
|
|
57
|
+
Question: Does execution match intent?
|
|
58
|
+
|
|
59
|
+
Checklist:
|
|
60
|
+
[ ] Real code paths are exercised
|
|
61
|
+
[ ] System under test is not mocked
|
|
62
|
+
[ ] Integration points are tested
|
|
63
|
+
[ ] Side effects are verifiable
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Red Flags:**
|
|
67
|
+
- Mocking the system under test
|
|
68
|
+
- Testing mock behavior
|
|
69
|
+
- Skipping critical paths
|
|
70
|
+
- No integration verification
|
|
71
|
+
|
|
72
|
+
### 4. Assertion Strength
|
|
73
|
+
```
|
|
74
|
+
Question: Do assertions prove correctness?
|
|
75
|
+
|
|
76
|
+
Checklist:
|
|
77
|
+
[ ] Assertions verify specific values
|
|
78
|
+
[ ] Success criteria are explicit
|
|
79
|
+
[ ] Failure cases are tested
|
|
80
|
+
[ ] Error messages are meaningful
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Red Flags:**
|
|
84
|
+
- `assert result` (too weak)
|
|
85
|
+
- `assert x is not None` (existence only)
|
|
86
|
+
- `assert mock.called` (testing mock)
|
|
87
|
+
- No negative assertions
|
|
88
|
+
|
|
89
|
+
### 5. Regression Prevention
|
|
90
|
+
```
|
|
91
|
+
Question: Would this catch real bugs?
|
|
92
|
+
|
|
93
|
+
Checklist:
|
|
94
|
+
[ ] Test would fail if feature removed
|
|
95
|
+
[ ] Boundary conditions tested
|
|
96
|
+
[ ] Edge cases covered
|
|
97
|
+
[ ] Known bug patterns caught
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**Red Flags:**
|
|
101
|
+
- Test passes with broken code
|
|
102
|
+
- Only happy path tested
|
|
103
|
+
- No boundary testing
|
|
104
|
+
- Missing error scenarios
|
|
105
|
+
|
|
106
|
+
## Inspection Report Template
|
|
107
|
+
|
|
108
|
+
```markdown
|
|
109
|
+
### Test: [test_name]
|
|
110
|
+
|
|
111
|
+
**Intent:** [What test claims to verify]
|
|
112
|
+
**Actually Tests:** [What it really tests]
|
|
113
|
+
|
|
114
|
+
**Strengths:**
|
|
115
|
+
- [Good aspects]
|
|
116
|
+
|
|
117
|
+
**Issues:**
|
|
118
|
+
1. [Issue] - [Impact]
|
|
119
|
+
2. [Issue] - [Impact]
|
|
120
|
+
|
|
121
|
+
**Suggestions:**
|
|
122
|
+
1. [Specific improvement]
|
|
123
|
+
2. [Additional test case]
|
|
124
|
+
3. [Assertion strengthening]
|
|
125
|
+
|
|
126
|
+
**Risk Level:** [LOW/MEDIUM/HIGH]
|
|
127
|
+
**Action:** [APPROVE/REQUEST_CHANGES/BLOCK]
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Risk Assessment
|
|
131
|
+
|
|
132
|
+
### HIGH Risk (Block merge)
|
|
133
|
+
- Weak assertions that would miss bugs
|
|
134
|
+
- Testing mock behavior only
|
|
135
|
+
- Missing critical failure cases
|
|
136
|
+
- Test passes with broken functionality
|
|
137
|
+
|
|
138
|
+
### MEDIUM Risk (Request changes)
|
|
139
|
+
- Incomplete coverage of scenarios
|
|
140
|
+
- Weak but not broken assertions
|
|
141
|
+
- Missing some error cases
|
|
142
|
+
- Could be stronger
|
|
143
|
+
|
|
144
|
+
### LOW Risk (Approve with notes)
|
|
145
|
+
- Minor naming improvements
|
|
146
|
+
- Additional nice-to-have tests
|
|
147
|
+
- Documentation enhancements
|
|
148
|
+
- Style consistency
|
|
149
|
+
|
|
150
|
+
## Common Patterns to Inspect
|
|
151
|
+
|
|
152
|
+
### Pattern 1: CRUD Operations
|
|
153
|
+
```python
|
|
154
|
+
# Check:
|
|
155
|
+
[ ] Create: Valid data, duplicate prevention, validation
|
|
156
|
+
[ ] Read: Exists, doesn't exist, multiple results
|
|
157
|
+
[ ] Update: Valid changes, invalid changes, concurrency
|
|
158
|
+
[ ] Delete: Exists, doesn't exist, cascade effects
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Pattern 2: Authentication/Authorization
|
|
162
|
+
```python
|
|
163
|
+
# Check:
|
|
164
|
+
[ ] Valid credentials succeed
|
|
165
|
+
[ ] Invalid credentials fail
|
|
166
|
+
[ ] Locked accounts rejected
|
|
167
|
+
[ ] Expired tokens rejected
|
|
168
|
+
[ ] Insufficient permissions denied
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### Pattern 3: Data Validation
|
|
172
|
+
```python
|
|
173
|
+
# Check:
|
|
174
|
+
[ ] Valid data accepted
|
|
175
|
+
[ ] Invalid format rejected
|
|
176
|
+
[ ] Missing required fields rejected
|
|
177
|
+
[ ] Boundary values tested
|
|
178
|
+
[ ] Type coercion tested
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Pattern 4: API Endpoints
|
|
182
|
+
```python
|
|
183
|
+
# Check:
|
|
184
|
+
[ ] Success response structure
|
|
185
|
+
[ ] Error response structure
|
|
186
|
+
[ ] Status codes correct
|
|
187
|
+
[ ] Request validation
|
|
188
|
+
[ ] Response validation
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Mental Debugging Technique
|
|
192
|
+
|
|
193
|
+
For each test, mentally introduce bugs:
|
|
194
|
+
|
|
195
|
+
### Bug 1: Remove Core Logic
|
|
196
|
+
```
|
|
197
|
+
If I comment out the main functionality,
|
|
198
|
+
would this test fail?
|
|
199
|
+
|
|
200
|
+
If NO: Test is not testing the right thing
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Bug 2: Return Wrong Data
|
|
204
|
+
```
|
|
205
|
+
If I return incorrect values,
|
|
206
|
+
would assertions catch it?
|
|
207
|
+
|
|
208
|
+
If NO: Assertions are too weak
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Bug 3: Skip Validation
|
|
212
|
+
```
|
|
213
|
+
If I remove input validation,
|
|
214
|
+
would test catch invalid data?
|
|
215
|
+
|
|
216
|
+
If NO: Missing negative test cases
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Bug 4: Break Error Handling
|
|
220
|
+
```
|
|
221
|
+
If I make errors silently fail,
|
|
222
|
+
would test detect it?
|
|
223
|
+
|
|
224
|
+
If NO: Not testing failure paths
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## Inspection Efficiency Tips
|
|
228
|
+
|
|
229
|
+
### Quick Wins
|
|
230
|
+
1. Check test names first (30 seconds)
|
|
231
|
+
2. Scan assertions (30 seconds)
|
|
232
|
+
3. Look for negative tests (30 seconds)
|
|
233
|
+
4. Check mock usage (30 seconds)
|
|
234
|
+
|
|
235
|
+
### Deep Dive Triggers
|
|
236
|
+
- Test name is vague
|
|
237
|
+
- Only one or two assertions
|
|
238
|
+
- No error cases visible
|
|
239
|
+
- Heavy mock usage
|
|
240
|
+
- Test recently added
|
|
241
|
+
|
|
242
|
+
### Batch Inspection
|
|
243
|
+
```
|
|
244
|
+
For test suite review:
|
|
245
|
+
1. Group tests by feature
|
|
246
|
+
2. Check coverage gaps between tests
|
|
247
|
+
3. Look for redundant tests
|
|
248
|
+
4. Identify missing scenarios
|
|
249
|
+
5. Verify integration tests exist
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Remember
|
|
253
|
+
|
|
254
|
+
✅ **Good inspection prevents:**
|
|
255
|
+
- False confidence from weak tests
|
|
256
|
+
- Production bugs slipping through
|
|
257
|
+
- Wasted time on bad tests
|
|
258
|
+
- Technical debt accumulation
|
|
259
|
+
|
|
260
|
+
❌ **Don't just check:**
|
|
261
|
+
- That tests exist
|
|
262
|
+
- That tests pass
|
|
263
|
+
- That coverage is high
|
|
264
|
+
- That names follow convention
|
|
265
|
+
|
|
266
|
+
✓ **Always verify:**
|
|
267
|
+
- Tests test the right thing
|
|
268
|
+
- Assertions are meaningful
|
|
269
|
+
- Failures are caught
|
|
270
|
+
- Regressions are prevented
|