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
|
@@ -10,12 +10,10 @@ import os
|
|
|
10
10
|
import re
|
|
11
11
|
import shutil
|
|
12
12
|
import stat
|
|
13
|
-
import subprocess
|
|
13
|
+
import subprocess # nosec B404 - Safe: only uses hardcoded 'claude' CLI command, no user input
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
from typing import Dict, List, Optional, Tuple
|
|
16
16
|
|
|
17
|
-
from ...core.logger import get_logger
|
|
18
|
-
|
|
19
17
|
|
|
20
18
|
class HookInstaller:
|
|
21
19
|
"""Manages installation and configuration of Claude MPM hooks."""
|
|
@@ -194,16 +192,24 @@ main "$@"
|
|
|
194
192
|
MIN_CLAUDE_VERSION = "1.0.92"
|
|
195
193
|
# Minimum version for PreToolUse input modification support
|
|
196
194
|
MIN_PRETOOL_MODIFY_VERSION = "2.0.30"
|
|
195
|
+
# Minimum version for user-invocable skills support
|
|
196
|
+
MIN_SKILLS_VERSION = "2.1.3"
|
|
197
197
|
|
|
198
198
|
def __init__(self):
|
|
199
199
|
"""Initialize the hook installer."""
|
|
200
|
-
|
|
200
|
+
# Use __name__ directly to avoid double prefix
|
|
201
|
+
# __name__ is already 'claude_mpm.hooks.claude_hooks.installer'
|
|
202
|
+
# get_logger() adds 'claude_mpm.' prefix, causing duplicate
|
|
203
|
+
import logging
|
|
204
|
+
|
|
205
|
+
self.logger = logging.getLogger(__name__)
|
|
201
206
|
self.claude_dir = Path.home() / ".claude"
|
|
202
207
|
self.hooks_dir = self.claude_dir / "hooks" # Kept for backward compatibility
|
|
203
208
|
# Use settings.json for hooks (Claude Code reads from this file)
|
|
204
209
|
self.settings_file = self.claude_dir / "settings.json"
|
|
205
|
-
#
|
|
206
|
-
|
|
210
|
+
# There is no legacy settings file - this was a bug where both pointed to same file
|
|
211
|
+
# Setting to None to disable cleanup that was deleting freshly installed hooks
|
|
212
|
+
self.old_settings_file = None
|
|
207
213
|
self._claude_version: Optional[str] = None
|
|
208
214
|
self._hook_script_path: Optional[Path] = None
|
|
209
215
|
|
|
@@ -219,7 +225,7 @@ main "$@"
|
|
|
219
225
|
|
|
220
226
|
try:
|
|
221
227
|
# Run claude --version command
|
|
222
|
-
result = subprocess.run(
|
|
228
|
+
result = subprocess.run( # nosec B607 B603 - Safe: hardcoded command, no user input
|
|
223
229
|
["claude", "--version"],
|
|
224
230
|
capture_output=True,
|
|
225
231
|
text=True,
|
|
@@ -330,6 +336,53 @@ main "$@"
|
|
|
330
336
|
|
|
331
337
|
return True
|
|
332
338
|
|
|
339
|
+
def _version_meets_minimum(self, version: str, min_version: str) -> bool:
|
|
340
|
+
"""Check if a version meets minimum requirements.
|
|
341
|
+
|
|
342
|
+
Args:
|
|
343
|
+
version: Current version string (e.g., "2.1.3")
|
|
344
|
+
min_version: Minimum required version string (e.g., "2.1.3")
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
True if version meets or exceeds minimum, False otherwise
|
|
348
|
+
"""
|
|
349
|
+
|
|
350
|
+
def parse_version(v: str) -> List[int]:
|
|
351
|
+
"""Parse semantic version string to list of integers."""
|
|
352
|
+
try:
|
|
353
|
+
return [int(x) for x in v.split(".")]
|
|
354
|
+
except (ValueError, AttributeError):
|
|
355
|
+
return [0]
|
|
356
|
+
|
|
357
|
+
current = parse_version(version)
|
|
358
|
+
required = parse_version(min_version)
|
|
359
|
+
|
|
360
|
+
# Compare versions
|
|
361
|
+
for i in range(max(len(current), len(required))):
|
|
362
|
+
curr_part = current[i] if i < len(current) else 0
|
|
363
|
+
req_part = required[i] if i < len(required) else 0
|
|
364
|
+
|
|
365
|
+
if curr_part < req_part:
|
|
366
|
+
return False
|
|
367
|
+
if curr_part > req_part:
|
|
368
|
+
return True
|
|
369
|
+
|
|
370
|
+
return True
|
|
371
|
+
|
|
372
|
+
def supports_user_invocable_skills(self) -> bool:
|
|
373
|
+
"""Check if Claude Code version supports user-invocable skills.
|
|
374
|
+
|
|
375
|
+
User-invocable skills were added in Claude Code v2.1.3.
|
|
376
|
+
This feature allows users to invoke skills via slash commands.
|
|
377
|
+
|
|
378
|
+
Returns:
|
|
379
|
+
True if version supports user-invocable skills, False otherwise
|
|
380
|
+
"""
|
|
381
|
+
version = self.get_claude_version()
|
|
382
|
+
if not version:
|
|
383
|
+
return False
|
|
384
|
+
return self._version_meets_minimum(version, self.MIN_SKILLS_VERSION)
|
|
385
|
+
|
|
333
386
|
def get_hook_script_path(self) -> Path:
|
|
334
387
|
"""Get the path to the hook handler script based on installation method.
|
|
335
388
|
|
|
@@ -462,7 +515,9 @@ main "$@"
|
|
|
462
515
|
|
|
463
516
|
def _cleanup_old_settings(self) -> None:
|
|
464
517
|
"""Remove hooks from old settings.json file if present."""
|
|
465
|
-
|
|
518
|
+
# No-op: old_settings_file was pointing to same file as settings_file (bug)
|
|
519
|
+
# This was causing freshly installed hooks to be immediately deleted
|
|
520
|
+
if self.old_settings_file is None or not self.old_settings_file.exists():
|
|
466
521
|
return
|
|
467
522
|
|
|
468
523
|
try:
|
|
@@ -482,6 +537,44 @@ main "$@"
|
|
|
482
537
|
except Exception as e:
|
|
483
538
|
self.logger.warning(f"Could not clean up old settings file: {e}")
|
|
484
539
|
|
|
540
|
+
def _fix_status_line(self, settings: Dict) -> None:
|
|
541
|
+
"""Fix statusLine command to handle both output style schema formats.
|
|
542
|
+
|
|
543
|
+
The statusLine command receives input in different formats:
|
|
544
|
+
- Newer format: {"activeOutputStyle": "Claude MPM", ...}
|
|
545
|
+
- Older format: {"output_style": {"name": "Claude MPM"}, ...}
|
|
546
|
+
|
|
547
|
+
This method ensures the jq expression checks both locations.
|
|
548
|
+
|
|
549
|
+
Args:
|
|
550
|
+
settings: The settings dictionary to update
|
|
551
|
+
"""
|
|
552
|
+
if "statusLine" not in settings:
|
|
553
|
+
return
|
|
554
|
+
|
|
555
|
+
status_line = settings.get("statusLine", {})
|
|
556
|
+
if "command" not in status_line:
|
|
557
|
+
return
|
|
558
|
+
|
|
559
|
+
command = status_line["command"]
|
|
560
|
+
|
|
561
|
+
# Pattern to match: '.output_style.name // "default"'
|
|
562
|
+
# We need to update it to: '.output_style.name // .activeOutputStyle // "default"'
|
|
563
|
+
old_pattern = r'\.output_style\.name\s*//\s*"default"'
|
|
564
|
+
new_pattern = '.output_style.name // .activeOutputStyle // "default"'
|
|
565
|
+
|
|
566
|
+
# Check if the command needs updating
|
|
567
|
+
if re.search(old_pattern, command) and ".activeOutputStyle" not in command:
|
|
568
|
+
updated_command = re.sub(old_pattern, new_pattern, command)
|
|
569
|
+
settings["statusLine"]["command"] = updated_command
|
|
570
|
+
self.logger.info(
|
|
571
|
+
"Fixed statusLine command to handle both output style schemas"
|
|
572
|
+
)
|
|
573
|
+
else:
|
|
574
|
+
self.logger.debug(
|
|
575
|
+
"StatusLine command already supports both schemas or not present"
|
|
576
|
+
)
|
|
577
|
+
|
|
485
578
|
def _update_claude_settings(self, hook_script_path: Path) -> None:
|
|
486
579
|
"""Update Claude settings to use the installed hook."""
|
|
487
580
|
self.logger.info("Updating Claude settings...")
|
|
@@ -518,15 +611,34 @@ main "$@"
|
|
|
518
611
|
}
|
|
519
612
|
]
|
|
520
613
|
|
|
521
|
-
#
|
|
522
|
-
|
|
523
|
-
for event_type in
|
|
614
|
+
# Simple events (no subtypes, no matcher needed)
|
|
615
|
+
simple_events = ["Stop", "SubagentStop", "SubagentStart"]
|
|
616
|
+
for event_type in simple_events:
|
|
524
617
|
settings["hooks"][event_type] = [
|
|
525
618
|
{
|
|
526
619
|
"hooks": [hook_command],
|
|
527
620
|
}
|
|
528
621
|
]
|
|
529
622
|
|
|
623
|
+
# SessionStart needs matcher for subtypes (startup, resume)
|
|
624
|
+
settings["hooks"]["SessionStart"] = [
|
|
625
|
+
{
|
|
626
|
+
"matcher": "*", # Match all SessionStart subtypes
|
|
627
|
+
"hooks": [hook_command],
|
|
628
|
+
}
|
|
629
|
+
]
|
|
630
|
+
|
|
631
|
+
# UserPromptSubmit needs matcher for potential subtypes
|
|
632
|
+
settings["hooks"]["UserPromptSubmit"] = [
|
|
633
|
+
{
|
|
634
|
+
"matcher": "*",
|
|
635
|
+
"hooks": [hook_command],
|
|
636
|
+
}
|
|
637
|
+
]
|
|
638
|
+
|
|
639
|
+
# Fix statusLine command to handle both output style schemas
|
|
640
|
+
self._fix_status_line(settings)
|
|
641
|
+
|
|
530
642
|
# Write settings to settings.json
|
|
531
643
|
with self.settings_file.open("w") as f:
|
|
532
644
|
json.dump(settings, f, indent=2)
|
|
@@ -537,7 +649,22 @@ main "$@"
|
|
|
537
649
|
self._cleanup_old_settings()
|
|
538
650
|
|
|
539
651
|
def _install_commands(self) -> None:
|
|
540
|
-
"""Install custom commands for Claude Code.
|
|
652
|
+
"""Install custom commands for Claude Code.
|
|
653
|
+
|
|
654
|
+
For Claude Code >= 2.1.3, commands are deployed as skills via PMSkillsDeployerService.
|
|
655
|
+
This method provides backward compatibility for older versions.
|
|
656
|
+
"""
|
|
657
|
+
# Check if skills-based commands are supported
|
|
658
|
+
if self.supports_user_invocable_skills():
|
|
659
|
+
self.logger.info(
|
|
660
|
+
"Claude Code >= 2.1.3 detected. Commands deployed as skills - "
|
|
661
|
+
"skipping legacy command installation."
|
|
662
|
+
)
|
|
663
|
+
return
|
|
664
|
+
|
|
665
|
+
# Legacy installation for older Claude Code versions
|
|
666
|
+
self.logger.info("Installing legacy commands for Claude Code < 2.1.3")
|
|
667
|
+
|
|
541
668
|
# Find commands directory using proper resource resolution
|
|
542
669
|
try:
|
|
543
670
|
from ...core.unified_paths import get_package_resource_path
|
|
@@ -650,9 +777,13 @@ main "$@"
|
|
|
650
777
|
old_script.unlink()
|
|
651
778
|
self.logger.info(f"Removed old deployed script: {old_script}")
|
|
652
779
|
|
|
653
|
-
# Remove from Claude settings
|
|
654
|
-
|
|
655
|
-
|
|
780
|
+
# Remove from Claude settings
|
|
781
|
+
settings_paths = [self.settings_file]
|
|
782
|
+
if self.old_settings_file is not None:
|
|
783
|
+
settings_paths.append(self.old_settings_file)
|
|
784
|
+
|
|
785
|
+
for settings_path in settings_paths:
|
|
786
|
+
if settings_path and settings_path.exists():
|
|
656
787
|
with settings_path.open() as f:
|
|
657
788
|
settings = json.load(f)
|
|
658
789
|
|
|
@@ -759,11 +890,11 @@ main "$@"
|
|
|
759
890
|
if "hooks" in settings:
|
|
760
891
|
status["configured_events"] = list(settings["hooks"].keys())
|
|
761
892
|
configured_in_local = True
|
|
762
|
-
except Exception:
|
|
893
|
+
except Exception: # nosec B110 - Intentional: ignore errors reading settings file
|
|
763
894
|
pass
|
|
764
895
|
|
|
765
896
|
# Also check old settings file
|
|
766
|
-
if self.old_settings_file.exists():
|
|
897
|
+
if self.old_settings_file is not None and self.old_settings_file.exists():
|
|
767
898
|
try:
|
|
768
899
|
with self.old_settings_file.open() as f:
|
|
769
900
|
old_settings = json.load(f)
|
|
@@ -773,7 +904,7 @@ main "$@"
|
|
|
773
904
|
status["warning"] = (
|
|
774
905
|
"Hooks found in settings.local.json but Claude Code reads from settings.json"
|
|
775
906
|
)
|
|
776
|
-
except Exception:
|
|
907
|
+
except Exception: # nosec B110 - Intentional: ignore errors reading old settings file
|
|
777
908
|
pass
|
|
778
909
|
|
|
779
910
|
status["settings_location"] = (
|
|
@@ -5,8 +5,64 @@ This module provides utilities for integrating with the memory system,
|
|
|
5
5
|
including pre and post delegation hooks.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
+
import logging
|
|
8
9
|
import os
|
|
9
|
-
import
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
# Try to import _log from hook_handler, fall back to no-op
|
|
13
|
+
try:
|
|
14
|
+
from claude_mpm.hooks.claude_hooks.hook_handler import _log
|
|
15
|
+
except ImportError:
|
|
16
|
+
|
|
17
|
+
def _log(msg: str) -> None:
|
|
18
|
+
pass # Silent fallback
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Install-type-aware logging configuration BEFORE kuzu-memory imports
|
|
22
|
+
# This overrides kuzu-memory's WARNING-level basicConfig (fixes 1M-445)
|
|
23
|
+
# but respects production install silence AND startup suppression
|
|
24
|
+
try:
|
|
25
|
+
from claude_mpm.core.unified_paths import DeploymentContext, PathContext
|
|
26
|
+
|
|
27
|
+
context = PathContext.detect_deployment_context()
|
|
28
|
+
|
|
29
|
+
# CRITICAL: Check if root logger is already suppressed (CRITICAL+1 from startup.py)
|
|
30
|
+
# If so, don't call basicConfig as it will reset the level to INFO
|
|
31
|
+
root_logger = logging.getLogger()
|
|
32
|
+
is_suppressed = root_logger.level > logging.CRITICAL # CRITICAL+1 = 51
|
|
33
|
+
|
|
34
|
+
# Only configure verbose logging for development/editable installs
|
|
35
|
+
# AND if logging isn't already suppressed by startup.py
|
|
36
|
+
if not is_suppressed and context in (
|
|
37
|
+
DeploymentContext.DEVELOPMENT,
|
|
38
|
+
DeploymentContext.EDITABLE_INSTALL,
|
|
39
|
+
):
|
|
40
|
+
# Write logs to file instead of stderr to avoid hook errors
|
|
41
|
+
log_dir = Path.home() / ".claude-mpm"
|
|
42
|
+
log_dir.mkdir(parents=True, exist_ok=True)
|
|
43
|
+
log_file = log_dir / "hooks.log"
|
|
44
|
+
logging.basicConfig(
|
|
45
|
+
level=logging.INFO,
|
|
46
|
+
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
47
|
+
force=True, # Python 3.8+ - reconfigures root logger
|
|
48
|
+
filename=str(log_file),
|
|
49
|
+
)
|
|
50
|
+
except ImportError:
|
|
51
|
+
# Fallback: if unified_paths not available, check suppression before configuring
|
|
52
|
+
root_logger = logging.getLogger()
|
|
53
|
+
is_suppressed = root_logger.level > logging.CRITICAL
|
|
54
|
+
|
|
55
|
+
if not is_suppressed:
|
|
56
|
+
# Write logs to file instead of stderr to avoid hook errors
|
|
57
|
+
log_dir = Path.home() / ".claude-mpm"
|
|
58
|
+
log_dir.mkdir(parents=True, exist_ok=True)
|
|
59
|
+
log_file = log_dir / "hooks.log"
|
|
60
|
+
logging.basicConfig(
|
|
61
|
+
level=logging.INFO,
|
|
62
|
+
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
63
|
+
force=True,
|
|
64
|
+
filename=str(log_file),
|
|
65
|
+
)
|
|
10
66
|
from datetime import datetime, timezone
|
|
11
67
|
from typing import Optional
|
|
12
68
|
|
|
@@ -32,7 +88,7 @@ try:
|
|
|
32
88
|
except Exception as e:
|
|
33
89
|
# Catch all exceptions to prevent any import errors from breaking the handler
|
|
34
90
|
if DEBUG:
|
|
35
|
-
|
|
91
|
+
_log(f"Memory hooks not available: {e}")
|
|
36
92
|
MEMORY_HOOKS_AVAILABLE = False
|
|
37
93
|
|
|
38
94
|
|
|
@@ -66,10 +122,7 @@ class MemoryHookManager:
|
|
|
66
122
|
# Only initialize if memory system is enabled
|
|
67
123
|
if not config.get("memory.enabled", True):
|
|
68
124
|
if DEBUG:
|
|
69
|
-
|
|
70
|
-
"Memory system disabled - skipping hook initialization",
|
|
71
|
-
file=sys.stderr,
|
|
72
|
-
)
|
|
125
|
+
_log("Memory system disabled - skipping hook initialization")
|
|
73
126
|
return
|
|
74
127
|
|
|
75
128
|
# Initialize pre-delegation hook for memory injection
|
|
@@ -87,14 +140,11 @@ class MemoryHookManager:
|
|
|
87
140
|
hooks_info.append("pre-delegation")
|
|
88
141
|
if self.post_delegation_hook:
|
|
89
142
|
hooks_info.append("post-delegation")
|
|
90
|
-
|
|
91
|
-
f"✅ Memory hooks initialized: {', '.join(hooks_info)}",
|
|
92
|
-
file=sys.stderr,
|
|
93
|
-
)
|
|
143
|
+
_log(f"✅ Memory hooks initialized: {', '.join(hooks_info)}")
|
|
94
144
|
|
|
95
145
|
except Exception as e:
|
|
96
146
|
if DEBUG:
|
|
97
|
-
|
|
147
|
+
_log(f"❌ Failed to initialize memory hooks: {e}")
|
|
98
148
|
# Don't fail the entire handler - memory system is optional
|
|
99
149
|
|
|
100
150
|
def trigger_pre_delegation_hook(
|
|
@@ -143,14 +193,13 @@ class MemoryHookManager:
|
|
|
143
193
|
|
|
144
194
|
if DEBUG:
|
|
145
195
|
memory_size = len(memory_section.encode("utf-8"))
|
|
146
|
-
|
|
147
|
-
f"✅ Injected {memory_size} bytes of memory for agent '{agent_type}'"
|
|
148
|
-
file=sys.stderr,
|
|
196
|
+
_log(
|
|
197
|
+
f"✅ Injected {memory_size} bytes of memory for agent '{agent_type}'"
|
|
149
198
|
)
|
|
150
199
|
|
|
151
200
|
except Exception as e:
|
|
152
201
|
if DEBUG:
|
|
153
|
-
|
|
202
|
+
_log(f"❌ Memory pre-delegation hook failed: {e}")
|
|
154
203
|
# Don't fail the delegation - memory is optional
|
|
155
204
|
|
|
156
205
|
def trigger_post_delegation_hook(
|
|
@@ -210,12 +259,11 @@ class MemoryHookManager:
|
|
|
210
259
|
if result.success and result.metadata:
|
|
211
260
|
learnings_extracted = result.metadata.get("learnings_extracted", 0)
|
|
212
261
|
if learnings_extracted > 0 and DEBUG:
|
|
213
|
-
|
|
214
|
-
f"✅ Extracted {learnings_extracted} learnings for agent '{agent_type}'"
|
|
215
|
-
file=sys.stderr,
|
|
262
|
+
_log(
|
|
263
|
+
f"✅ Extracted {learnings_extracted} learnings for agent '{agent_type}'"
|
|
216
264
|
)
|
|
217
265
|
|
|
218
266
|
except Exception as e:
|
|
219
267
|
if DEBUG:
|
|
220
|
-
|
|
268
|
+
_log(f"❌ Memory post-delegation hook failed: {e}")
|
|
221
269
|
# Don't fail the delegation result - memory is optional
|
|
@@ -8,18 +8,25 @@ with their original requests.
|
|
|
8
8
|
import json
|
|
9
9
|
import os
|
|
10
10
|
import re
|
|
11
|
-
import sys
|
|
12
11
|
from datetime import datetime, timezone
|
|
13
12
|
from pathlib import Path
|
|
14
13
|
from typing import Any, Optional
|
|
15
14
|
|
|
15
|
+
# Try to import _log from hook_handler, fall back to no-op
|
|
16
|
+
try:
|
|
17
|
+
from claude_mpm.hooks.claude_hooks.hook_handler import _log
|
|
18
|
+
except ImportError:
|
|
19
|
+
|
|
20
|
+
def _log(msg: str) -> None:
|
|
21
|
+
pass # Silent fallback
|
|
22
|
+
|
|
23
|
+
|
|
16
24
|
# Debug mode
|
|
17
25
|
DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
|
|
18
26
|
|
|
19
27
|
# Response tracking integration
|
|
20
28
|
# NOTE: ResponseTracker import moved to _initialize_response_tracking() for lazy loading
|
|
21
|
-
# This prevents unnecessary import of
|
|
22
|
-
# when hooks don't need response tracking
|
|
29
|
+
# This prevents unnecessary import of heavy dependencies when hooks don't need response tracking
|
|
23
30
|
RESPONSE_TRACKING_AVAILABLE = (
|
|
24
31
|
True # Assume available, will check on actual initialization
|
|
25
32
|
)
|
|
@@ -51,7 +58,7 @@ class ResponseTrackingManager:
|
|
|
51
58
|
response tracking without code changes.
|
|
52
59
|
|
|
53
60
|
NOTE: ResponseTracker is imported lazily here to avoid loading
|
|
54
|
-
|
|
61
|
+
heavy dependencies unless actually needed.
|
|
55
62
|
"""
|
|
56
63
|
try:
|
|
57
64
|
# Lazy import of ResponseTracker to avoid unnecessary dependency loading
|
|
@@ -81,10 +88,7 @@ class ResponseTrackingManager:
|
|
|
81
88
|
|
|
82
89
|
if not (response_tracking_enabled or response_logging_enabled):
|
|
83
90
|
if DEBUG:
|
|
84
|
-
|
|
85
|
-
"Response tracking disabled - skipping initialization",
|
|
86
|
-
file=sys.stderr,
|
|
87
|
-
)
|
|
91
|
+
_log("Response tracking disabled - skipping initialization")
|
|
88
92
|
return
|
|
89
93
|
|
|
90
94
|
# Initialize response tracker with config
|
|
@@ -102,15 +106,11 @@ class ResponseTrackingManager:
|
|
|
102
106
|
if self.track_all_interactions
|
|
103
107
|
else "Task delegations only"
|
|
104
108
|
)
|
|
105
|
-
|
|
106
|
-
f"✅ Response tracking initialized (mode: {mode})", file=sys.stderr
|
|
107
|
-
)
|
|
109
|
+
_log(f"✅ Response tracking initialized (mode: {mode})")
|
|
108
110
|
|
|
109
111
|
except Exception as e:
|
|
110
112
|
if DEBUG:
|
|
111
|
-
|
|
112
|
-
f"❌ Failed to initialize response tracking: {e}", file=sys.stderr
|
|
113
|
-
)
|
|
113
|
+
_log(f"❌ Failed to initialize response tracking: {e}")
|
|
114
114
|
# Don't fail the entire handler - response tracking is optional
|
|
115
115
|
|
|
116
116
|
def track_agent_response(
|
|
@@ -131,12 +131,11 @@ class ResponseTrackingManager:
|
|
|
131
131
|
|
|
132
132
|
try:
|
|
133
133
|
# Get the original request data stored during pre-tool
|
|
134
|
-
request_info = delegation_requests.get(session_id)
|
|
134
|
+
request_info = delegation_requests.get(session_id) # nosec B113 - False positive: dict.get(), not requests library
|
|
135
135
|
if not request_info:
|
|
136
136
|
if DEBUG:
|
|
137
|
-
|
|
138
|
-
f"No request data found for session {session_id}, skipping response tracking"
|
|
139
|
-
file=sys.stderr,
|
|
137
|
+
_log(
|
|
138
|
+
f"No request data found for session {session_id}, skipping response tracking"
|
|
140
139
|
)
|
|
141
140
|
return
|
|
142
141
|
|
|
@@ -164,15 +163,11 @@ class ResponseTrackingManager:
|
|
|
164
163
|
if json_match:
|
|
165
164
|
structured_response = json.loads(json_match.group(1))
|
|
166
165
|
if DEBUG:
|
|
167
|
-
|
|
168
|
-
f"Extracted structured response from {agent_type} agent",
|
|
169
|
-
file=sys.stderr,
|
|
170
|
-
)
|
|
166
|
+
_log(f"Extracted structured response from {agent_type} agent")
|
|
171
167
|
except (json.JSONDecodeError, AttributeError) as e:
|
|
172
168
|
if DEBUG:
|
|
173
|
-
|
|
174
|
-
f"No structured JSON response found in {agent_type} agent output: {e}"
|
|
175
|
-
file=sys.stderr,
|
|
169
|
+
_log(
|
|
170
|
+
f"No structured JSON response found in {agent_type} agent output: {e}"
|
|
176
171
|
)
|
|
177
172
|
|
|
178
173
|
# Get the original request (prompt + description)
|
|
@@ -221,9 +216,8 @@ class ResponseTrackingManager:
|
|
|
221
216
|
if structured_response.get("MEMORIES"):
|
|
222
217
|
if DEBUG:
|
|
223
218
|
memories_count = len(structured_response["MEMORIES"])
|
|
224
|
-
|
|
225
|
-
f"Agent {agent_type} returned MEMORIES field with {memories_count} items"
|
|
226
|
-
file=sys.stderr,
|
|
219
|
+
_log(
|
|
220
|
+
f"Agent {agent_type} returned MEMORIES field with {memories_count} items"
|
|
227
221
|
)
|
|
228
222
|
|
|
229
223
|
# Check if task was completed for logging purposes
|
|
@@ -233,9 +227,7 @@ class ResponseTrackingManager:
|
|
|
233
227
|
# Log files modified for debugging
|
|
234
228
|
if DEBUG and structured_response.get("files_modified"):
|
|
235
229
|
files = [f["file"] for f in structured_response["files_modified"]]
|
|
236
|
-
|
|
237
|
-
f"Agent {agent_type} modified files: {files}", file=sys.stderr
|
|
238
|
-
)
|
|
230
|
+
_log(f"Agent {agent_type} modified files: {files}")
|
|
239
231
|
|
|
240
232
|
# Track the response
|
|
241
233
|
file_path = self.response_tracker.track_response(
|
|
@@ -247,14 +239,12 @@ class ResponseTrackingManager:
|
|
|
247
239
|
)
|
|
248
240
|
|
|
249
241
|
if file_path and DEBUG:
|
|
250
|
-
|
|
251
|
-
f"✅ Tracked response for {agent_type} agent in session {session_id}: {file_path.name}"
|
|
252
|
-
file=sys.stderr,
|
|
242
|
+
_log(
|
|
243
|
+
f"✅ Tracked response for {agent_type} agent in session {session_id}: {file_path.name}"
|
|
253
244
|
)
|
|
254
245
|
elif DEBUG and not file_path:
|
|
255
|
-
|
|
256
|
-
f"Response tracking returned None for {agent_type} agent (might be excluded or disabled)"
|
|
257
|
-
file=sys.stderr,
|
|
246
|
+
_log(
|
|
247
|
+
f"Response tracking returned None for {agent_type} agent (might be excluded or disabled)"
|
|
258
248
|
)
|
|
259
249
|
|
|
260
250
|
# Clean up the request data after successful tracking
|
|
@@ -262,7 +252,7 @@ class ResponseTrackingManager:
|
|
|
262
252
|
|
|
263
253
|
except Exception as e:
|
|
264
254
|
if DEBUG:
|
|
265
|
-
|
|
255
|
+
_log(f"❌ Failed to track agent response: {e}")
|
|
266
256
|
# Don't fail the hook processing - response tracking is optional
|
|
267
257
|
|
|
268
258
|
def track_stop_response(
|
|
@@ -287,11 +277,10 @@ class ResponseTrackingManager:
|
|
|
287
277
|
prompt_data = pending_prompts.get(session_id)
|
|
288
278
|
|
|
289
279
|
if DEBUG:
|
|
290
|
-
|
|
291
|
-
f" - output present: {bool(output)} (length: {len(str(output)) if output else 0})"
|
|
292
|
-
file=sys.stderr,
|
|
280
|
+
_log(
|
|
281
|
+
f" - output present: {bool(output)} (length: {len(str(output)) if output else 0})"
|
|
293
282
|
)
|
|
294
|
-
|
|
283
|
+
_log(f" - prompt_data present: {bool(prompt_data)}")
|
|
295
284
|
|
|
296
285
|
if output and prompt_data:
|
|
297
286
|
# Add prompt timestamp to metadata
|
|
@@ -301,12 +290,11 @@ class ResponseTrackingManager:
|
|
|
301
290
|
if "stop_reason" in event:
|
|
302
291
|
metadata["stop_reason"] = event["stop_reason"]
|
|
303
292
|
if DEBUG:
|
|
304
|
-
|
|
305
|
-
f" - Captured stop_reason: {event['stop_reason']}",
|
|
306
|
-
file=sys.stderr,
|
|
307
|
-
)
|
|
293
|
+
_log(f" - Captured stop_reason: {event['stop_reason']}")
|
|
308
294
|
|
|
309
295
|
# Capture Claude API usage data if available
|
|
296
|
+
# NOTE: Usage data is already captured in metadata by handle_stop_fast()
|
|
297
|
+
# which also handles auto-pause triggering (even when response tracking disabled)
|
|
310
298
|
if "usage" in event:
|
|
311
299
|
usage_data = event["usage"]
|
|
312
300
|
metadata["usage"] = {
|
|
@@ -323,10 +311,7 @@ class ResponseTrackingManager:
|
|
|
323
311
|
total_tokens = usage_data.get(
|
|
324
312
|
"input_tokens", 0
|
|
325
313
|
) + usage_data.get("output_tokens", 0)
|
|
326
|
-
|
|
327
|
-
f" - Captured usage: {total_tokens} total tokens",
|
|
328
|
-
file=sys.stderr,
|
|
329
|
-
)
|
|
314
|
+
_log(f" - Captured usage: {total_tokens} total tokens")
|
|
330
315
|
|
|
331
316
|
# Track the main Claude response
|
|
332
317
|
file_path = self.response_tracker.track_response(
|
|
@@ -338,14 +323,14 @@ class ResponseTrackingManager:
|
|
|
338
323
|
)
|
|
339
324
|
|
|
340
325
|
if file_path and DEBUG:
|
|
341
|
-
|
|
326
|
+
_log(f" - Response tracked to: {file_path}")
|
|
342
327
|
|
|
343
328
|
# Clean up pending prompt
|
|
344
329
|
del pending_prompts[session_id]
|
|
345
330
|
|
|
346
331
|
except Exception as e:
|
|
347
332
|
if DEBUG:
|
|
348
|
-
|
|
333
|
+
_log(f"Error tracking stop response: {e}")
|
|
349
334
|
|
|
350
335
|
def track_assistant_response(self, event: dict, pending_prompts: dict):
|
|
351
336
|
"""Handle assistant response events for comprehensive response tracking."""
|
|
@@ -360,9 +345,8 @@ class ResponseTrackingManager:
|
|
|
360
345
|
prompt_data = pending_prompts.get(session_id)
|
|
361
346
|
if not prompt_data:
|
|
362
347
|
if DEBUG:
|
|
363
|
-
|
|
364
|
-
f"No stored prompt for session {session_id[:8]}..., skipping response tracking"
|
|
365
|
-
file=sys.stderr,
|
|
348
|
+
_log(
|
|
349
|
+
f"No stored prompt for session {session_id[:8]}..., skipping response tracking"
|
|
366
350
|
)
|
|
367
351
|
return
|
|
368
352
|
|
|
@@ -376,9 +360,8 @@ class ResponseTrackingManager:
|
|
|
376
360
|
|
|
377
361
|
if not response_content:
|
|
378
362
|
if DEBUG:
|
|
379
|
-
|
|
380
|
-
f"No response content in event for session {session_id[:8]}..."
|
|
381
|
-
file=sys.stderr,
|
|
363
|
+
_log(
|
|
364
|
+
f"No response content in event for session {session_id[:8]}..."
|
|
382
365
|
)
|
|
383
366
|
return
|
|
384
367
|
|
|
@@ -400,9 +383,8 @@ class ResponseTrackingManager:
|
|
|
400
383
|
)
|
|
401
384
|
|
|
402
385
|
if file_path and DEBUG:
|
|
403
|
-
|
|
404
|
-
f"✅ Tracked Claude response for session {session_id[:8]}...: {file_path.name}"
|
|
405
|
-
file=sys.stderr,
|
|
386
|
+
_log(
|
|
387
|
+
f"✅ Tracked Claude response for session {session_id[:8]}...: {file_path.name}"
|
|
406
388
|
)
|
|
407
389
|
|
|
408
390
|
# Clean up the stored prompt
|
|
@@ -410,4 +392,4 @@ class ResponseTrackingManager:
|
|
|
410
392
|
|
|
411
393
|
except Exception as e:
|
|
412
394
|
if DEBUG:
|
|
413
|
-
|
|
395
|
+
_log(f"❌ Failed to track assistant response: {e}")
|
|
Binary file
|
|
Binary file
|