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,566 @@
|
|
|
1
|
+
"""CLI commands for auto-generating todos from hook errors.
|
|
2
|
+
|
|
3
|
+
WHY this is needed:
|
|
4
|
+
- Convert hook errors into actionable todos for the PM
|
|
5
|
+
- Enable PM to delegate error resolution to appropriate agents
|
|
6
|
+
- Reduce manual todo creation overhead
|
|
7
|
+
- Maintain error visibility in the PM's workflow
|
|
8
|
+
|
|
9
|
+
DESIGN DECISION: Event-driven architecture
|
|
10
|
+
- Read from event log instead of hook_errors.json
|
|
11
|
+
- Event log provides clean separation between detection and consumption
|
|
12
|
+
- Supports multiple consumers (CLI, dashboard, notifications)
|
|
13
|
+
- Persistent storage with pending/resolved status tracking
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import json
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import Any, Dict, List, Optional
|
|
20
|
+
|
|
21
|
+
import click
|
|
22
|
+
|
|
23
|
+
from claude_mpm.services.delegation_detector import get_delegation_detector
|
|
24
|
+
from claude_mpm.services.event_log import get_event_log
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def format_error_event_as_todo(event: Dict[str, Any]) -> Dict[str, str]:
|
|
28
|
+
"""Convert event log error event to todo format compatible with PM TodoWrite.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
event: Event from event log with payload containing error details
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
Dictionary with todo fields (content, activeForm, status)
|
|
35
|
+
"""
|
|
36
|
+
payload = event.get("payload", {})
|
|
37
|
+
error_type = payload.get("error_type", "unknown")
|
|
38
|
+
hook_type = payload.get("hook_type", "unknown")
|
|
39
|
+
details = payload.get("details", "")
|
|
40
|
+
full_message = payload.get("full_message", "")
|
|
41
|
+
|
|
42
|
+
# Create concise todo content
|
|
43
|
+
content = f"Fix {hook_type} hook error: {error_type}"
|
|
44
|
+
if details:
|
|
45
|
+
content += f" ({details[:50]}{'...' if len(details) > 50 else ''})"
|
|
46
|
+
|
|
47
|
+
# Active form for in-progress display
|
|
48
|
+
active_form = f"Fixing {hook_type} hook error"
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
"content": content,
|
|
52
|
+
"activeForm": active_form,
|
|
53
|
+
"status": "pending",
|
|
54
|
+
"metadata": {
|
|
55
|
+
"event_id": event.get("id", ""),
|
|
56
|
+
"event_type": event.get("event_type", ""),
|
|
57
|
+
"error_type": error_type,
|
|
58
|
+
"hook_type": hook_type,
|
|
59
|
+
"details": details,
|
|
60
|
+
"full_message": full_message,
|
|
61
|
+
"suggested_fix": payload.get("suggested_fix", ""),
|
|
62
|
+
"timestamp": event.get("timestamp", ""),
|
|
63
|
+
},
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def format_delegation_event_as_todo(event: Dict[str, Any]) -> Dict[str, str]:
|
|
68
|
+
"""Convert event log delegation event to todo format compatible with PM TodoWrite.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
event: Event from event log with payload containing delegation details
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
Dictionary with todo fields (content, activeForm, status)
|
|
75
|
+
"""
|
|
76
|
+
payload = event.get("payload", {})
|
|
77
|
+
pattern_type = payload.get("pattern_type", "Task")
|
|
78
|
+
suggested_todo = payload.get("suggested_todo", "")
|
|
79
|
+
action = payload.get("action", "")
|
|
80
|
+
original_text = payload.get("original_text", "")
|
|
81
|
+
|
|
82
|
+
# Create concise todo content
|
|
83
|
+
content = f"[Delegation] {suggested_todo}"
|
|
84
|
+
|
|
85
|
+
# Active form for in-progress display
|
|
86
|
+
active_form = f"Delegating: {action[:30]}..."
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
"content": content,
|
|
90
|
+
"activeForm": active_form,
|
|
91
|
+
"status": "pending",
|
|
92
|
+
"metadata": {
|
|
93
|
+
"event_id": event.get("id", ""),
|
|
94
|
+
"event_type": event.get("event_type", ""),
|
|
95
|
+
"pattern_type": pattern_type,
|
|
96
|
+
"suggested_todo": suggested_todo,
|
|
97
|
+
"action": action,
|
|
98
|
+
"original_text": original_text,
|
|
99
|
+
"timestamp": event.get("timestamp", ""),
|
|
100
|
+
},
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def get_autotodos(max_todos: int = 100) -> List[Dict[str, Any]]:
|
|
105
|
+
"""Get all pending hook error events formatted as todos.
|
|
106
|
+
|
|
107
|
+
DESIGN DECISION: Only autotodo.error events are returned
|
|
108
|
+
- autotodo.error = Script/coding failures → PM should delegate fix
|
|
109
|
+
- pm.violation = Delegation anti-patterns → PM behavior error (not todo)
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
max_todos: Maximum number of todos to return (default: 100)
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
List of todo dictionaries ready for PM injection
|
|
116
|
+
"""
|
|
117
|
+
event_log = get_event_log()
|
|
118
|
+
todos = []
|
|
119
|
+
|
|
120
|
+
# Get all pending autotodo.error events (script failures)
|
|
121
|
+
pending_error_events = event_log.list_events(
|
|
122
|
+
event_type="autotodo.error", status="pending"
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
for event in pending_error_events[:max_todos]:
|
|
126
|
+
todo = format_error_event_as_todo(event)
|
|
127
|
+
todos.append(todo)
|
|
128
|
+
|
|
129
|
+
return todos
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def get_pending_todos(
|
|
133
|
+
max_todos: int = 10, working_dir: Optional[Path] = None
|
|
134
|
+
) -> List[Dict[str, Any]]:
|
|
135
|
+
"""Get pending autotodo errors for injection.
|
|
136
|
+
|
|
137
|
+
WHY this function exists:
|
|
138
|
+
- Provides a consistent API for retrieving pending autotodos
|
|
139
|
+
- Used by CLI inject command AND SessionStart hook
|
|
140
|
+
- Supports limiting number of todos to avoid overwhelming PM
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
max_todos: Maximum number of todos to return (default: 10)
|
|
144
|
+
working_dir: Working directory to use for event log path (default: Path.cwd())
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
List of todo dicts with content, activeForm, status, metadata
|
|
148
|
+
"""
|
|
149
|
+
# Construct log file path from working_dir if provided
|
|
150
|
+
log_file = None
|
|
151
|
+
if working_dir:
|
|
152
|
+
log_file = Path(working_dir) / ".claude-mpm" / "event_log.json"
|
|
153
|
+
|
|
154
|
+
event_log = get_event_log(log_file)
|
|
155
|
+
todos = []
|
|
156
|
+
|
|
157
|
+
# Get all pending autotodo.error events (script failures)
|
|
158
|
+
pending_error_events = event_log.list_events(
|
|
159
|
+
event_type="autotodo.error", status="pending"
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
for event in pending_error_events[:max_todos]:
|
|
163
|
+
todo = format_error_event_as_todo(event)
|
|
164
|
+
todos.append(todo)
|
|
165
|
+
|
|
166
|
+
return todos
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
@click.group(name="autotodos")
|
|
170
|
+
def autotodos_group():
|
|
171
|
+
"""Auto-generate todos from hook errors.
|
|
172
|
+
|
|
173
|
+
This command converts hook errors into actionable todos that can be
|
|
174
|
+
injected into the PM's todo list for delegation and resolution.
|
|
175
|
+
|
|
176
|
+
Uses event-driven architecture - reads from event log instead of
|
|
177
|
+
directly from hook error memory.
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@autotodos_group.command(name="status")
|
|
182
|
+
def show_autotodos_status():
|
|
183
|
+
"""Show autotodos status and statistics.
|
|
184
|
+
|
|
185
|
+
Quick overview of pending hook errors, PM violations, and autotodos.
|
|
186
|
+
|
|
187
|
+
Example:
|
|
188
|
+
claude-mpm autotodos status
|
|
189
|
+
"""
|
|
190
|
+
event_log = get_event_log()
|
|
191
|
+
stats = event_log.get_stats()
|
|
192
|
+
todos = get_autotodos()
|
|
193
|
+
violations = event_log.list_events(event_type="pm.violation", status="pending")
|
|
194
|
+
|
|
195
|
+
click.echo("\n📊 AutoTodos Status")
|
|
196
|
+
click.echo("=" * 80)
|
|
197
|
+
|
|
198
|
+
click.echo(f"Total Events: {stats['total_events']}")
|
|
199
|
+
click.echo(f"Pending Todos (script errors): {len(todos)}")
|
|
200
|
+
click.echo(f"Pending Violations (PM errors): {len(violations)}")
|
|
201
|
+
click.echo(f"Total Pending Events: {stats['by_status']['pending']}")
|
|
202
|
+
click.echo(f"Resolved Events: {stats['by_status']['resolved']}")
|
|
203
|
+
|
|
204
|
+
if stats.get("by_type"):
|
|
205
|
+
click.echo("\n📋 Events by Type:")
|
|
206
|
+
for event_type, count in stats["by_type"].items():
|
|
207
|
+
click.echo(f" {event_type}: {count}")
|
|
208
|
+
|
|
209
|
+
click.echo(f"\n📁 Event Log: {stats['log_file']}")
|
|
210
|
+
|
|
211
|
+
if todos or violations:
|
|
212
|
+
click.echo("\n⚠️ Action Required:")
|
|
213
|
+
if todos:
|
|
214
|
+
click.echo(f" {len(todos)} script error(s) need delegation")
|
|
215
|
+
if violations:
|
|
216
|
+
click.echo(f" {len(violations)} PM violation(s) need correction")
|
|
217
|
+
click.echo("\nCommands:")
|
|
218
|
+
click.echo(
|
|
219
|
+
" claude-mpm autotodos list # View pending todos (script errors)"
|
|
220
|
+
)
|
|
221
|
+
click.echo(" claude-mpm autotodos violations # View PM violations")
|
|
222
|
+
click.echo(" claude-mpm autotodos inject # Inject todos into PM session")
|
|
223
|
+
click.echo(" claude-mpm autotodos clear # Clear after resolution")
|
|
224
|
+
else:
|
|
225
|
+
click.echo("\n✅ No pending todos or violations. All clear!")
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
@autotodos_group.command(name="list")
|
|
229
|
+
@click.option(
|
|
230
|
+
"--format",
|
|
231
|
+
type=click.Choice(["table", "json"], case_sensitive=False),
|
|
232
|
+
default="table",
|
|
233
|
+
help="Output format (table or json)",
|
|
234
|
+
)
|
|
235
|
+
def list_autotodos(format):
|
|
236
|
+
"""List all auto-generated todos from hook errors.
|
|
237
|
+
|
|
238
|
+
Shows pending hook errors formatted as todos that can be acted upon
|
|
239
|
+
by the PM.
|
|
240
|
+
|
|
241
|
+
Examples:
|
|
242
|
+
claude-mpm autotodos list
|
|
243
|
+
claude-mpm autotodos list --format json
|
|
244
|
+
"""
|
|
245
|
+
todos = get_autotodos()
|
|
246
|
+
|
|
247
|
+
if not todos:
|
|
248
|
+
click.echo("✅ No pending hook errors. All clear!")
|
|
249
|
+
return
|
|
250
|
+
|
|
251
|
+
if format == "json":
|
|
252
|
+
# JSON output for programmatic use
|
|
253
|
+
click.echo(json.dumps(todos, indent=2))
|
|
254
|
+
else:
|
|
255
|
+
# Table output for human readability
|
|
256
|
+
click.echo("\n" + "=" * 80)
|
|
257
|
+
click.echo("Auto-Generated Todos from Hook Errors")
|
|
258
|
+
click.echo("=" * 80)
|
|
259
|
+
|
|
260
|
+
for i, todo in enumerate(todos, 1):
|
|
261
|
+
metadata = todo.get("metadata", {})
|
|
262
|
+
click.echo(f"\n{i}. {todo['content']}")
|
|
263
|
+
click.echo(f" Status: {todo['status']}")
|
|
264
|
+
click.echo(f" Hook: {metadata.get('hook_type', 'Unknown')}")
|
|
265
|
+
click.echo(f" Error Type: {metadata.get('error_type', 'Unknown')}")
|
|
266
|
+
click.echo(f" Timestamp: {metadata.get('timestamp', 'Unknown')}")
|
|
267
|
+
|
|
268
|
+
# Show suggested fix if available
|
|
269
|
+
suggested_fix = metadata.get("suggested_fix", "")
|
|
270
|
+
if suggested_fix:
|
|
271
|
+
# Show first line of suggestion
|
|
272
|
+
first_line = suggested_fix.split("\n")[0]
|
|
273
|
+
click.echo(f" Suggestion: {first_line}")
|
|
274
|
+
|
|
275
|
+
click.echo("\n" + "=" * 80)
|
|
276
|
+
click.echo(f"Total: {len(todos)} pending todo(s)")
|
|
277
|
+
click.echo("\nTo inject into PM session: claude-mpm autotodos inject")
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
@autotodos_group.command(name="inject")
|
|
281
|
+
@click.option(
|
|
282
|
+
"--output",
|
|
283
|
+
type=click.Path(),
|
|
284
|
+
help="Output file path (default: stdout)",
|
|
285
|
+
)
|
|
286
|
+
def inject_autotodos(output):
|
|
287
|
+
"""Inject auto-generated todos in PM-compatible format.
|
|
288
|
+
|
|
289
|
+
Outputs todos in a format that can be injected into the PM's
|
|
290
|
+
session as system reminders.
|
|
291
|
+
|
|
292
|
+
Examples:
|
|
293
|
+
claude-mpm autotodos inject
|
|
294
|
+
claude-mpm autotodos inject --output todos.json
|
|
295
|
+
"""
|
|
296
|
+
todos = get_autotodos()
|
|
297
|
+
|
|
298
|
+
if not todos:
|
|
299
|
+
click.echo("✅ No pending hook errors to inject.", err=True)
|
|
300
|
+
return
|
|
301
|
+
|
|
302
|
+
# Format as system reminder for PM
|
|
303
|
+
pm_message = {
|
|
304
|
+
"type": "autotodos",
|
|
305
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
306
|
+
"todos": todos,
|
|
307
|
+
"message": f"Found {len(todos)} hook error(s) requiring attention. "
|
|
308
|
+
"Consider delegating to appropriate agents for resolution.",
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
output_json = json.dumps(pm_message, indent=2)
|
|
312
|
+
|
|
313
|
+
if output:
|
|
314
|
+
# Write to file
|
|
315
|
+
output_path = Path(output)
|
|
316
|
+
output_path.write_text(output_json)
|
|
317
|
+
click.echo(f"✅ Injected {len(todos)} todo(s) to {output_path}", err=True)
|
|
318
|
+
else:
|
|
319
|
+
# Write to stdout for piping
|
|
320
|
+
click.echo(output_json)
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
@autotodos_group.command(name="clear")
|
|
324
|
+
@click.option(
|
|
325
|
+
"--event-id",
|
|
326
|
+
help="Clear specific event by ID",
|
|
327
|
+
)
|
|
328
|
+
@click.option(
|
|
329
|
+
"--event-type",
|
|
330
|
+
type=click.Choice(["error", "violation", "all"], case_sensitive=False),
|
|
331
|
+
default="all",
|
|
332
|
+
help="Type of events to clear (default: all)",
|
|
333
|
+
)
|
|
334
|
+
@click.option(
|
|
335
|
+
"--yes",
|
|
336
|
+
"-y",
|
|
337
|
+
is_flag=True,
|
|
338
|
+
help="Skip confirmation prompt",
|
|
339
|
+
)
|
|
340
|
+
def clear_autotodos(event_id, event_type, yes):
|
|
341
|
+
"""Clear hook errors and PM violations after resolution.
|
|
342
|
+
|
|
343
|
+
This marks resolved events in the event log, removing them from
|
|
344
|
+
the autotodos and violations lists.
|
|
345
|
+
|
|
346
|
+
Examples:
|
|
347
|
+
claude-mpm autotodos clear # Clear all pending
|
|
348
|
+
claude-mpm autotodos clear --event-type error # Clear only errors
|
|
349
|
+
claude-mpm autotodos clear --event-type violation # Clear only violations
|
|
350
|
+
claude-mpm autotodos clear --event-id ID # Clear specific event
|
|
351
|
+
claude-mpm autotodos clear -y # Skip confirmation
|
|
352
|
+
"""
|
|
353
|
+
event_log = get_event_log()
|
|
354
|
+
|
|
355
|
+
if event_id:
|
|
356
|
+
# Clear specific event
|
|
357
|
+
if not yes:
|
|
358
|
+
message = f"Clear event: {event_id}?"
|
|
359
|
+
if not click.confirm(message):
|
|
360
|
+
click.echo("Cancelled.")
|
|
361
|
+
return
|
|
362
|
+
|
|
363
|
+
# Mark as resolved
|
|
364
|
+
if event_log.mark_resolved(event_id):
|
|
365
|
+
click.echo(f"✅ Cleared event: {event_id}")
|
|
366
|
+
else:
|
|
367
|
+
click.echo(f"❌ Event not found: {event_id}")
|
|
368
|
+
else:
|
|
369
|
+
# Determine which event types to clear
|
|
370
|
+
if event_type == "error":
|
|
371
|
+
event_types = ["autotodo.error"]
|
|
372
|
+
elif event_type == "violation":
|
|
373
|
+
event_types = ["pm.violation"]
|
|
374
|
+
else: # all
|
|
375
|
+
event_types = ["autotodo.error", "pm.violation"]
|
|
376
|
+
|
|
377
|
+
# Count pending events
|
|
378
|
+
total_count = 0
|
|
379
|
+
for et in event_types:
|
|
380
|
+
pending = event_log.list_events(event_type=et, status="pending")
|
|
381
|
+
total_count += len(pending)
|
|
382
|
+
|
|
383
|
+
if total_count == 0:
|
|
384
|
+
click.echo("No pending events to clear.")
|
|
385
|
+
return
|
|
386
|
+
|
|
387
|
+
if not yes:
|
|
388
|
+
message = f"Clear all {total_count} pending event(s)?"
|
|
389
|
+
if not click.confirm(message):
|
|
390
|
+
click.echo("Cancelled.")
|
|
391
|
+
return
|
|
392
|
+
|
|
393
|
+
# Mark all as resolved
|
|
394
|
+
total_cleared = 0
|
|
395
|
+
for et in event_types:
|
|
396
|
+
cleared = event_log.mark_all_resolved(event_type=et)
|
|
397
|
+
total_cleared += cleared
|
|
398
|
+
|
|
399
|
+
click.echo(f"✅ Cleared {total_cleared} event(s).")
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
@autotodos_group.command(name="violations")
|
|
403
|
+
@click.option(
|
|
404
|
+
"--format",
|
|
405
|
+
type=click.Choice(["table", "json"], case_sensitive=False),
|
|
406
|
+
default="table",
|
|
407
|
+
help="Output format (table or json)",
|
|
408
|
+
)
|
|
409
|
+
def list_pm_violations(format):
|
|
410
|
+
"""List PM delegation violations.
|
|
411
|
+
|
|
412
|
+
Shows instances where PM asked user to do something manually
|
|
413
|
+
instead of delegating to an agent. These are PM behavior errors
|
|
414
|
+
that should be corrected, not todos to delegate.
|
|
415
|
+
|
|
416
|
+
Examples:
|
|
417
|
+
claude-mpm autotodos violations
|
|
418
|
+
claude-mpm autotodos violations --format json
|
|
419
|
+
"""
|
|
420
|
+
event_log = get_event_log()
|
|
421
|
+
violations = event_log.list_events(event_type="pm.violation", status="pending")
|
|
422
|
+
|
|
423
|
+
if not violations:
|
|
424
|
+
click.echo("✅ No PM violations detected. All delegation patterns are correct!")
|
|
425
|
+
return
|
|
426
|
+
|
|
427
|
+
if format == "json":
|
|
428
|
+
# JSON output for programmatic use
|
|
429
|
+
click.echo(json.dumps(violations, indent=2))
|
|
430
|
+
else:
|
|
431
|
+
# Table output for human readability
|
|
432
|
+
click.echo("\n" + "=" * 80)
|
|
433
|
+
click.echo("PM Delegation Violations")
|
|
434
|
+
click.echo("=" * 80)
|
|
435
|
+
click.echo("\n⚠️ PM asked user to do these manually instead of delegating:\n")
|
|
436
|
+
|
|
437
|
+
for i, violation in enumerate(violations, 1):
|
|
438
|
+
payload = violation.get("payload", {})
|
|
439
|
+
click.echo(f"{i}. Pattern: {payload.get('pattern_type', 'Unknown')}")
|
|
440
|
+
click.echo(f' Original: "{payload.get("original_text", "")}"')
|
|
441
|
+
click.echo(f" Should delegate: {payload.get('suggested_action', '')}")
|
|
442
|
+
click.echo(f" Severity: {payload.get('severity', 'unknown')}")
|
|
443
|
+
click.echo(f" Timestamp: {violation.get('timestamp', 'Unknown')}")
|
|
444
|
+
click.echo()
|
|
445
|
+
|
|
446
|
+
click.echo("=" * 80)
|
|
447
|
+
click.echo(f"Total: {len(violations)} violation(s) detected")
|
|
448
|
+
click.echo("\n💡 These are PM behavior errors - PM should delegate these tasks")
|
|
449
|
+
click.echo(" to appropriate agents instead of asking user to do them.")
|
|
450
|
+
click.echo("\nTo clear: claude-mpm autotodos clear --event-type violation")
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
@autotodos_group.command(name="scan")
|
|
454
|
+
@click.argument("text", required=False)
|
|
455
|
+
@click.option(
|
|
456
|
+
"--file",
|
|
457
|
+
"-f",
|
|
458
|
+
type=click.Path(exists=True),
|
|
459
|
+
help="Scan text from file instead of argument",
|
|
460
|
+
)
|
|
461
|
+
@click.option(
|
|
462
|
+
"--format",
|
|
463
|
+
type=click.Choice(["table", "json"], case_sensitive=False),
|
|
464
|
+
default="table",
|
|
465
|
+
help="Output format (table or json)",
|
|
466
|
+
)
|
|
467
|
+
@click.option(
|
|
468
|
+
"--save",
|
|
469
|
+
is_flag=True,
|
|
470
|
+
help="Save detections to event log as PM violations",
|
|
471
|
+
)
|
|
472
|
+
def scan_delegation_patterns(text, file, format, save):
|
|
473
|
+
"""Scan text for delegation anti-patterns.
|
|
474
|
+
|
|
475
|
+
Detects when PM asks user to do something manually instead of
|
|
476
|
+
delegating to an agent. Helps enforce the delegation principle.
|
|
477
|
+
|
|
478
|
+
Examples:
|
|
479
|
+
claude-mpm autotodos scan "Make sure .env.local is in .gitignore"
|
|
480
|
+
claude-mpm autotodos scan -f response.txt
|
|
481
|
+
claude-mpm autotodos scan -f response.txt --save
|
|
482
|
+
echo "You'll need to run npm install" | claude-mpm autotodos scan
|
|
483
|
+
"""
|
|
484
|
+
detector = get_delegation_detector()
|
|
485
|
+
|
|
486
|
+
# Read text from file, argument, or stdin
|
|
487
|
+
if file:
|
|
488
|
+
text = Path(file).read_text()
|
|
489
|
+
elif not text:
|
|
490
|
+
# Read from stdin
|
|
491
|
+
import sys
|
|
492
|
+
|
|
493
|
+
text = sys.stdin.read()
|
|
494
|
+
|
|
495
|
+
if not text or not text.strip():
|
|
496
|
+
click.echo("Error: No text provided to scan.", err=True)
|
|
497
|
+
click.echo("\nUsage:", err=True)
|
|
498
|
+
click.echo(" claude-mpm autotodos scan 'text to scan'", err=True)
|
|
499
|
+
click.echo(" claude-mpm autotodos scan -f file.txt", err=True)
|
|
500
|
+
click.echo(" echo 'text' | claude-mpm autotodos scan", err=True)
|
|
501
|
+
return
|
|
502
|
+
|
|
503
|
+
# Detect delegation patterns
|
|
504
|
+
detections = detector.detect_user_delegation(text)
|
|
505
|
+
|
|
506
|
+
if not detections:
|
|
507
|
+
click.echo("✅ No delegation anti-patterns detected!")
|
|
508
|
+
return
|
|
509
|
+
|
|
510
|
+
# Save to event log if requested
|
|
511
|
+
if save:
|
|
512
|
+
event_log = get_event_log()
|
|
513
|
+
for detection in detections:
|
|
514
|
+
# Format as PM violation payload
|
|
515
|
+
payload = {
|
|
516
|
+
"violation_type": "delegation_anti_pattern",
|
|
517
|
+
"pattern_type": detection["pattern_type"],
|
|
518
|
+
"original_text": detection["original_text"],
|
|
519
|
+
"suggested_action": detection["suggested_todo"],
|
|
520
|
+
"action": detection["action"],
|
|
521
|
+
"source": "delegation_detector",
|
|
522
|
+
"severity": "warning",
|
|
523
|
+
"message": f"PM asked user to do something manually: {detection['original_text'][:80]}...",
|
|
524
|
+
}
|
|
525
|
+
event_log.append_event(
|
|
526
|
+
event_type="pm.violation", payload=payload, status="pending"
|
|
527
|
+
)
|
|
528
|
+
click.echo(f"\n✅ Saved {len(detections)} violation(s) to event log")
|
|
529
|
+
|
|
530
|
+
# Output results
|
|
531
|
+
if format == "json":
|
|
532
|
+
# JSON output for programmatic use
|
|
533
|
+
click.echo(json.dumps(detections, indent=2))
|
|
534
|
+
else:
|
|
535
|
+
# Table output for human readability
|
|
536
|
+
click.echo("\n" + "=" * 80)
|
|
537
|
+
click.echo("Delegation Anti-Patterns Detected")
|
|
538
|
+
click.echo("=" * 80)
|
|
539
|
+
click.echo(
|
|
540
|
+
"\n⚠️ PM is asking user to do these manually instead of delegating:\n"
|
|
541
|
+
)
|
|
542
|
+
|
|
543
|
+
for i, detection in enumerate(detections, 1):
|
|
544
|
+
click.echo(f"{i}. Pattern: {detection['pattern_type']}")
|
|
545
|
+
click.echo(f' Original: "{detection["original_text"]}"')
|
|
546
|
+
click.echo(f" Suggested Todo: {detection['suggested_todo']}")
|
|
547
|
+
click.echo(f" Action: {detection['action']}")
|
|
548
|
+
click.echo()
|
|
549
|
+
|
|
550
|
+
click.echo("=" * 80)
|
|
551
|
+
click.echo(f"Total: {len(detections)} anti-pattern(s) detected")
|
|
552
|
+
click.echo("\n💡 Tip: PM should delegate these tasks to appropriate agents")
|
|
553
|
+
click.echo(" instead of asking the user to do them manually.")
|
|
554
|
+
|
|
555
|
+
if not save:
|
|
556
|
+
click.echo("\n Use --save to add these as autotodos for PM to see.")
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
# Register the command group
|
|
560
|
+
def register_commands(cli):
|
|
561
|
+
"""Register autotodos commands with CLI.
|
|
562
|
+
|
|
563
|
+
Args:
|
|
564
|
+
cli: Click CLI group to register commands with
|
|
565
|
+
"""
|
|
566
|
+
cli.add_command(autotodos_group)
|