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,204 @@
|
|
|
1
|
+
"""Adapter registry for runtime detection and selection.
|
|
2
|
+
|
|
3
|
+
This module provides a registry for managing runtime adapters, with
|
|
4
|
+
automatic detection of available runtimes on the system.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import shutil
|
|
9
|
+
from typing import Dict, List, Optional, Type
|
|
10
|
+
|
|
11
|
+
from .base import RuntimeAdapter
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class AdapterRegistry:
|
|
17
|
+
"""Registry for managing runtime adapters.
|
|
18
|
+
|
|
19
|
+
Provides centralized registration, retrieval, and auto-detection
|
|
20
|
+
of available runtime adapters.
|
|
21
|
+
|
|
22
|
+
Example:
|
|
23
|
+
>>> # Register adapter
|
|
24
|
+
>>> AdapterRegistry.register('claude-code', ClaudeCodeAdapter)
|
|
25
|
+
>>> # Get adapter instance
|
|
26
|
+
>>> adapter = AdapterRegistry.get('claude-code')
|
|
27
|
+
>>> # Detect available runtimes
|
|
28
|
+
>>> available = AdapterRegistry.detect_available()
|
|
29
|
+
>>> print(available)
|
|
30
|
+
['claude-code', 'mpm']
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
_adapters: Dict[str, Type[RuntimeAdapter]] = {}
|
|
34
|
+
_runtime_commands: Dict[str, str] = {
|
|
35
|
+
"claude-code": "claude",
|
|
36
|
+
"auggie": "auggie",
|
|
37
|
+
"codex": "codex",
|
|
38
|
+
"mpm": "claude", # MPM uses claude with extra config
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@classmethod
|
|
42
|
+
def register(cls, name: str, adapter_class: Type[RuntimeAdapter]) -> None:
|
|
43
|
+
"""Register a runtime adapter.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
name: Unique identifier for the adapter
|
|
47
|
+
adapter_class: RuntimeAdapter subclass to register
|
|
48
|
+
|
|
49
|
+
Example:
|
|
50
|
+
>>> AdapterRegistry.register('my-runtime', MyAdapter)
|
|
51
|
+
"""
|
|
52
|
+
cls._adapters[name] = adapter_class
|
|
53
|
+
logger.debug(f"Registered adapter: {name}")
|
|
54
|
+
|
|
55
|
+
@classmethod
|
|
56
|
+
def unregister(cls, name: str) -> None:
|
|
57
|
+
"""Unregister a runtime adapter.
|
|
58
|
+
|
|
59
|
+
Args:
|
|
60
|
+
name: Identifier of adapter to unregister
|
|
61
|
+
|
|
62
|
+
Example:
|
|
63
|
+
>>> AdapterRegistry.unregister('my-runtime')
|
|
64
|
+
"""
|
|
65
|
+
if name in cls._adapters:
|
|
66
|
+
del cls._adapters[name]
|
|
67
|
+
logger.debug(f"Unregistered adapter: {name}")
|
|
68
|
+
|
|
69
|
+
@classmethod
|
|
70
|
+
def get(cls, name: str) -> Optional[RuntimeAdapter]:
|
|
71
|
+
"""Get adapter instance by name.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
name: Identifier of adapter to retrieve
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
RuntimeAdapter instance if found, None otherwise
|
|
78
|
+
|
|
79
|
+
Example:
|
|
80
|
+
>>> adapter = AdapterRegistry.get('claude-code')
|
|
81
|
+
>>> if adapter:
|
|
82
|
+
... print(adapter.name)
|
|
83
|
+
'claude-code'
|
|
84
|
+
"""
|
|
85
|
+
if name in cls._adapters:
|
|
86
|
+
adapter = cls._adapters[name]()
|
|
87
|
+
logger.debug(f"Retrieved adapter: {name}")
|
|
88
|
+
return adapter
|
|
89
|
+
logger.warning(f"Adapter not found: {name}")
|
|
90
|
+
return None
|
|
91
|
+
|
|
92
|
+
@classmethod
|
|
93
|
+
def list_registered(cls) -> List[str]:
|
|
94
|
+
"""List all registered adapter names.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
List of registered adapter identifiers
|
|
98
|
+
|
|
99
|
+
Example:
|
|
100
|
+
>>> registered = AdapterRegistry.list_registered()
|
|
101
|
+
>>> print(registered)
|
|
102
|
+
['claude-code', 'auggie', 'codex', 'mpm']
|
|
103
|
+
"""
|
|
104
|
+
return list(cls._adapters.keys())
|
|
105
|
+
|
|
106
|
+
@classmethod
|
|
107
|
+
def detect_available(cls) -> List[str]:
|
|
108
|
+
"""Detect which runtimes are available on this system.
|
|
109
|
+
|
|
110
|
+
Checks for CLI commands in PATH to determine which runtimes
|
|
111
|
+
are installed and accessible.
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
List of available runtime identifiers
|
|
115
|
+
|
|
116
|
+
Example:
|
|
117
|
+
>>> available = AdapterRegistry.detect_available()
|
|
118
|
+
>>> if 'claude-code' in available:
|
|
119
|
+
... print("Claude Code is available")
|
|
120
|
+
"""
|
|
121
|
+
available = []
|
|
122
|
+
|
|
123
|
+
for name, command in cls._runtime_commands.items():
|
|
124
|
+
if name in cls._adapters and shutil.which(command):
|
|
125
|
+
available.append(name)
|
|
126
|
+
logger.debug(f"Detected available runtime: {name} (command: {command})")
|
|
127
|
+
|
|
128
|
+
logger.info(f"Available runtimes: {available}")
|
|
129
|
+
return available
|
|
130
|
+
|
|
131
|
+
@classmethod
|
|
132
|
+
def get_default(cls) -> Optional[RuntimeAdapter]:
|
|
133
|
+
"""Get the best available adapter.
|
|
134
|
+
|
|
135
|
+
Selection priority: mpm > claude-code > auggie > codex
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
RuntimeAdapter instance for best available runtime, or None
|
|
139
|
+
|
|
140
|
+
Example:
|
|
141
|
+
>>> adapter = AdapterRegistry.get_default()
|
|
142
|
+
>>> if adapter:
|
|
143
|
+
... print(f"Using {adapter.name}")
|
|
144
|
+
"""
|
|
145
|
+
# Priority order: MPM has most features, then Claude Code, etc.
|
|
146
|
+
priority = ["mpm", "claude-code", "auggie", "codex"]
|
|
147
|
+
|
|
148
|
+
available = cls.detect_available()
|
|
149
|
+
|
|
150
|
+
for name in priority:
|
|
151
|
+
if name in available:
|
|
152
|
+
adapter = cls.get(name)
|
|
153
|
+
logger.info(f"Selected default adapter: {name}")
|
|
154
|
+
return adapter
|
|
155
|
+
|
|
156
|
+
logger.warning("No adapters available")
|
|
157
|
+
return None
|
|
158
|
+
|
|
159
|
+
@classmethod
|
|
160
|
+
def is_available(cls, name: str) -> bool:
|
|
161
|
+
"""Check if a specific runtime is available.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
name: Runtime identifier to check
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
True if runtime is registered and command is in PATH
|
|
168
|
+
|
|
169
|
+
Example:
|
|
170
|
+
>>> if AdapterRegistry.is_available('claude-code'):
|
|
171
|
+
... adapter = AdapterRegistry.get('claude-code')
|
|
172
|
+
"""
|
|
173
|
+
return name in cls.detect_available()
|
|
174
|
+
|
|
175
|
+
@classmethod
|
|
176
|
+
def get_command(cls, name: str) -> Optional[str]:
|
|
177
|
+
"""Get CLI command for a runtime.
|
|
178
|
+
|
|
179
|
+
Args:
|
|
180
|
+
name: Runtime identifier
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
CLI command string if found, None otherwise
|
|
184
|
+
|
|
185
|
+
Example:
|
|
186
|
+
>>> cmd = AdapterRegistry.get_command('claude-code')
|
|
187
|
+
>>> print(cmd)
|
|
188
|
+
'claude'
|
|
189
|
+
"""
|
|
190
|
+
return cls._runtime_commands.get(name)
|
|
191
|
+
|
|
192
|
+
@classmethod
|
|
193
|
+
def register_command(cls, name: str, command: str) -> None:
|
|
194
|
+
"""Register CLI command for a runtime.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
name: Runtime identifier
|
|
198
|
+
command: CLI command to invoke runtime
|
|
199
|
+
|
|
200
|
+
Example:
|
|
201
|
+
>>> AdapterRegistry.register_command('my-runtime', 'my-cli')
|
|
202
|
+
"""
|
|
203
|
+
cls._runtime_commands[name] = command
|
|
204
|
+
logger.debug(f"Registered command for {name}: {command}")
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""MPM Commander REST API.
|
|
2
|
+
|
|
3
|
+
This package provides a FastAPI-based REST API for managing projects,
|
|
4
|
+
sessions, and messages in the MPM Commander.
|
|
5
|
+
|
|
6
|
+
Example:
|
|
7
|
+
Run the API server with uvicorn:
|
|
8
|
+
|
|
9
|
+
$ uvicorn claude_mpm.commander.api.app:app --host 127.0.0.1 --port 8000
|
|
10
|
+
|
|
11
|
+
Access the API documentation at http://127.0.0.1:8000/docs
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from .app import app
|
|
15
|
+
|
|
16
|
+
__all__ = ["app"]
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"""FastAPI application for MPM Commander REST API.
|
|
2
|
+
|
|
3
|
+
This module defines the main FastAPI application instance with CORS,
|
|
4
|
+
lifecycle management, and route registration.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from contextlib import asynccontextmanager
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import AsyncGenerator
|
|
10
|
+
|
|
11
|
+
from fastapi import FastAPI
|
|
12
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
13
|
+
from fastapi.responses import FileResponse
|
|
14
|
+
from fastapi.staticfiles import StaticFiles
|
|
15
|
+
|
|
16
|
+
from ..events.manager import EventManager
|
|
17
|
+
from ..inbox import Inbox
|
|
18
|
+
from ..registry import ProjectRegistry
|
|
19
|
+
from ..tmux_orchestrator import TmuxOrchestrator
|
|
20
|
+
from ..workflow import EventHandler
|
|
21
|
+
from .routes import events, inbox as inbox_routes, messages, projects, sessions, work
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@asynccontextmanager
|
|
25
|
+
async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
|
|
26
|
+
"""Manage application lifecycle.
|
|
27
|
+
|
|
28
|
+
Initializes shared resources on startup and cleans up on shutdown.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
app: FastAPI application instance
|
|
32
|
+
|
|
33
|
+
Yields:
|
|
34
|
+
None during application runtime
|
|
35
|
+
"""
|
|
36
|
+
# Startup
|
|
37
|
+
import logging
|
|
38
|
+
|
|
39
|
+
logger = logging.getLogger(__name__)
|
|
40
|
+
logger.info("Lifespan starting. Initializing app.state resources...")
|
|
41
|
+
|
|
42
|
+
# Initialize app.state resources (daemon will inject its instances later)
|
|
43
|
+
if not hasattr(app.state, "registry"):
|
|
44
|
+
app.state.registry = ProjectRegistry()
|
|
45
|
+
if not hasattr(app.state, "tmux"):
|
|
46
|
+
app.state.tmux = TmuxOrchestrator()
|
|
47
|
+
if not hasattr(app.state, "event_manager"):
|
|
48
|
+
app.state.event_manager = EventManager()
|
|
49
|
+
if not hasattr(app.state, "inbox"):
|
|
50
|
+
app.state.inbox = Inbox(app.state.event_manager, app.state.registry)
|
|
51
|
+
if not hasattr(app.state, "session_manager"):
|
|
52
|
+
app.state.session_manager = {}
|
|
53
|
+
if not hasattr(app.state, "work_queues"):
|
|
54
|
+
logger.info("work_queues not set, creating new dict")
|
|
55
|
+
app.state.work_queues = {}
|
|
56
|
+
else:
|
|
57
|
+
logger.info(
|
|
58
|
+
f"work_queues already set, preserving id: {id(app.state.work_queues)}"
|
|
59
|
+
)
|
|
60
|
+
if not hasattr(app.state, "daemon_instance"):
|
|
61
|
+
app.state.daemon_instance = None
|
|
62
|
+
if not hasattr(app.state, "event_handler"):
|
|
63
|
+
app.state.event_handler = EventHandler(
|
|
64
|
+
app.state.inbox, app.state.session_manager
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
logger.info(f"Lifespan complete. work_queues id: {id(app.state.work_queues)}")
|
|
68
|
+
|
|
69
|
+
yield
|
|
70
|
+
|
|
71
|
+
# Shutdown
|
|
72
|
+
# No cleanup needed for Phase 1
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
app = FastAPI(
|
|
76
|
+
title="MPM Commander API",
|
|
77
|
+
description="REST API for MPM Commander - Autonomous AI Orchestration",
|
|
78
|
+
version="1.0.0",
|
|
79
|
+
lifespan=lifespan,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# CORS for local development
|
|
83
|
+
app.add_middleware(
|
|
84
|
+
CORSMiddleware,
|
|
85
|
+
allow_origins=["http://localhost:*"],
|
|
86
|
+
allow_credentials=True,
|
|
87
|
+
allow_methods=["*"],
|
|
88
|
+
allow_headers=["*"],
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
# Include routers
|
|
92
|
+
app.include_router(projects.router, prefix="/api", tags=["projects"])
|
|
93
|
+
app.include_router(sessions.router, prefix="/api", tags=["sessions"])
|
|
94
|
+
app.include_router(messages.router, prefix="/api", tags=["messages"])
|
|
95
|
+
app.include_router(inbox_routes.router, prefix="/api", tags=["inbox"])
|
|
96
|
+
app.include_router(events.router, prefix="/api", tags=["events"])
|
|
97
|
+
app.include_router(work.router, prefix="/api", tags=["work"])
|
|
98
|
+
|
|
99
|
+
# Mount static files
|
|
100
|
+
static_path = Path(__file__).parent.parent / "web" / "static"
|
|
101
|
+
app.mount("/static", StaticFiles(directory=str(static_path)), name="static")
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@app.get("/api/health")
|
|
105
|
+
async def health_check() -> dict:
|
|
106
|
+
"""Health check endpoint.
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
Status and version information
|
|
110
|
+
"""
|
|
111
|
+
return {"status": "ok", "version": "1.0.0"}
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@app.get("/")
|
|
115
|
+
async def root() -> FileResponse:
|
|
116
|
+
"""Serve the web UI index page.
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
HTML page for the web UI
|
|
120
|
+
"""
|
|
121
|
+
return FileResponse(static_path / "index.html")
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"""Error handling for MPM Commander API.
|
|
2
|
+
|
|
3
|
+
This module defines custom exception classes that map to HTTP error responses
|
|
4
|
+
with structured error codes and messages.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from fastapi import HTTPException
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CommanderAPIError(HTTPException):
|
|
11
|
+
"""Base exception for all Commander API errors.
|
|
12
|
+
|
|
13
|
+
Provides consistent error response format with code and message.
|
|
14
|
+
|
|
15
|
+
Attributes:
|
|
16
|
+
code: Machine-readable error code
|
|
17
|
+
message: Human-readable error message
|
|
18
|
+
status_code: HTTP status code
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def __init__(self, code: str, message: str, status_code: int = 400):
|
|
22
|
+
"""Initialize API error.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
code: Error code (e.g., "PROJECT_NOT_FOUND")
|
|
26
|
+
message: Descriptive error message
|
|
27
|
+
status_code: HTTP status code (default: 400)
|
|
28
|
+
"""
|
|
29
|
+
super().__init__(
|
|
30
|
+
status_code=status_code,
|
|
31
|
+
detail={"error": {"code": code, "message": message}},
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ProjectNotFoundError(CommanderAPIError):
|
|
36
|
+
"""Project with given ID does not exist."""
|
|
37
|
+
|
|
38
|
+
def __init__(self, project_id: str):
|
|
39
|
+
"""Initialize project not found error.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
project_id: The project ID that was not found
|
|
43
|
+
"""
|
|
44
|
+
super().__init__(
|
|
45
|
+
"PROJECT_NOT_FOUND",
|
|
46
|
+
f"Project not found: {project_id}",
|
|
47
|
+
404,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class ProjectAlreadyExistsError(CommanderAPIError):
|
|
52
|
+
"""Project already registered at given path."""
|
|
53
|
+
|
|
54
|
+
def __init__(self, path: str):
|
|
55
|
+
"""Initialize project already exists error.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
path: The path that is already registered
|
|
59
|
+
"""
|
|
60
|
+
super().__init__(
|
|
61
|
+
"PROJECT_ALREADY_EXISTS",
|
|
62
|
+
f"Project already registered: {path}",
|
|
63
|
+
409,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class InvalidPathError(CommanderAPIError):
|
|
68
|
+
"""Path does not exist or is not a directory."""
|
|
69
|
+
|
|
70
|
+
def __init__(self, path: str):
|
|
71
|
+
"""Initialize invalid path error.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
path: The invalid path
|
|
75
|
+
"""
|
|
76
|
+
super().__init__(
|
|
77
|
+
"INVALID_PATH",
|
|
78
|
+
f"Path does not exist or is not a directory: {path}",
|
|
79
|
+
400,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class SessionNotFoundError(CommanderAPIError):
|
|
84
|
+
"""Session with given ID does not exist."""
|
|
85
|
+
|
|
86
|
+
def __init__(self, session_id: str):
|
|
87
|
+
"""Initialize session not found error.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
session_id: The session ID that was not found
|
|
91
|
+
"""
|
|
92
|
+
super().__init__(
|
|
93
|
+
"SESSION_NOT_FOUND",
|
|
94
|
+
f"Session not found: {session_id}",
|
|
95
|
+
404,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class InvalidRuntimeError(CommanderAPIError):
|
|
100
|
+
"""Invalid runtime adapter specified."""
|
|
101
|
+
|
|
102
|
+
def __init__(self, runtime: str):
|
|
103
|
+
"""Initialize invalid runtime error.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
runtime: The invalid runtime name
|
|
107
|
+
"""
|
|
108
|
+
super().__init__(
|
|
109
|
+
"INVALID_RUNTIME",
|
|
110
|
+
f"Invalid runtime: {runtime}",
|
|
111
|
+
400,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class TmuxNoSpaceError(CommanderAPIError):
|
|
116
|
+
"""Raised when tmux has no space for a new pane."""
|
|
117
|
+
|
|
118
|
+
def __init__(self, message: str | None = None):
|
|
119
|
+
"""Initialize tmux no space error.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
message: Custom error message (optional)
|
|
123
|
+
"""
|
|
124
|
+
default_msg = (
|
|
125
|
+
"Unable to create session: tmux has no space for new pane. "
|
|
126
|
+
"Try closing some sessions or resize your terminal window. "
|
|
127
|
+
"You can also create a new tmux window with `tmux new-window`."
|
|
128
|
+
)
|
|
129
|
+
super().__init__(
|
|
130
|
+
"TMUX_NO_SPACE",
|
|
131
|
+
message or default_msg,
|
|
132
|
+
409,
|
|
133
|
+
)
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"""REST API routes for event resolution.
|
|
2
|
+
|
|
3
|
+
Provides HTTP endpoints for resolving events and managing event responses.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from typing import List, Optional
|
|
7
|
+
|
|
8
|
+
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
9
|
+
from pydantic import BaseModel
|
|
10
|
+
|
|
11
|
+
from ...events.manager import EventManager
|
|
12
|
+
|
|
13
|
+
router = APIRouter()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def get_event_manager() -> EventManager:
|
|
17
|
+
"""Dependency to get the global event manager instance.
|
|
18
|
+
|
|
19
|
+
Returns:
|
|
20
|
+
The global event manager instance
|
|
21
|
+
|
|
22
|
+
Raises:
|
|
23
|
+
RuntimeError: If event manager is not initialized
|
|
24
|
+
"""
|
|
25
|
+
from ..app import event_manager
|
|
26
|
+
|
|
27
|
+
if event_manager is None:
|
|
28
|
+
raise RuntimeError("Event manager not initialized")
|
|
29
|
+
return event_manager
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def get_event_handler():
|
|
33
|
+
"""Dependency to get the global event handler instance.
|
|
34
|
+
|
|
35
|
+
Returns:
|
|
36
|
+
The global event handler instance
|
|
37
|
+
|
|
38
|
+
Raises:
|
|
39
|
+
RuntimeError: If event handler is not initialized
|
|
40
|
+
"""
|
|
41
|
+
from ..app import event_handler
|
|
42
|
+
|
|
43
|
+
if event_handler is None:
|
|
44
|
+
raise RuntimeError("Event handler not initialized")
|
|
45
|
+
return event_handler
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class EventResponse(BaseModel):
|
|
49
|
+
"""Request model for event resolution.
|
|
50
|
+
|
|
51
|
+
Attributes:
|
|
52
|
+
response: User's response to the event
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
response: str
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class EventResolutionResponse(BaseModel):
|
|
59
|
+
"""Response model for event resolution.
|
|
60
|
+
|
|
61
|
+
Attributes:
|
|
62
|
+
event_id: ID of resolved event
|
|
63
|
+
status: Resolution status
|
|
64
|
+
session_resumed: Whether project session was resumed
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
event_id: str
|
|
68
|
+
status: str
|
|
69
|
+
session_resumed: bool
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class PendingEventResponse(BaseModel):
|
|
73
|
+
"""Response model for pending event.
|
|
74
|
+
|
|
75
|
+
Attributes:
|
|
76
|
+
event_id: Unique event identifier
|
|
77
|
+
project_id: Project that raised this event
|
|
78
|
+
event_type: Type of event
|
|
79
|
+
priority: Urgency level
|
|
80
|
+
status: Current lifecycle status
|
|
81
|
+
title: Short event summary
|
|
82
|
+
content: Detailed event message
|
|
83
|
+
options: For DECISION_NEEDED events, list of choices
|
|
84
|
+
is_blocking: Whether event blocks progress
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
event_id: str
|
|
88
|
+
project_id: str
|
|
89
|
+
event_type: str
|
|
90
|
+
priority: str
|
|
91
|
+
status: str
|
|
92
|
+
title: str
|
|
93
|
+
content: str
|
|
94
|
+
options: Optional[List[str]]
|
|
95
|
+
is_blocking: bool
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
@router.post("/events/{event_id}/resolve", response_model=EventResolutionResponse)
|
|
99
|
+
async def resolve_event(
|
|
100
|
+
event_id: str,
|
|
101
|
+
response: EventResponse,
|
|
102
|
+
event_handler=Depends(get_event_handler),
|
|
103
|
+
) -> EventResolutionResponse:
|
|
104
|
+
"""Resolve an event with user response.
|
|
105
|
+
|
|
106
|
+
Marks the event as resolved and resumes the project session if it was
|
|
107
|
+
paused for this event.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
event_id: ID of event to resolve
|
|
111
|
+
response: User's response to the event
|
|
112
|
+
|
|
113
|
+
Returns:
|
|
114
|
+
Resolution status and whether session was resumed
|
|
115
|
+
|
|
116
|
+
Raises:
|
|
117
|
+
HTTPException: If event not found (404) or resolution fails (500)
|
|
118
|
+
|
|
119
|
+
Example:
|
|
120
|
+
POST /api/events/evt_123/resolve
|
|
121
|
+
{
|
|
122
|
+
"response": "Use authlib for OAuth2"
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
Response:
|
|
126
|
+
{
|
|
127
|
+
"event_id": "evt_123",
|
|
128
|
+
"status": "resolved",
|
|
129
|
+
"session_resumed": true
|
|
130
|
+
}
|
|
131
|
+
"""
|
|
132
|
+
try:
|
|
133
|
+
session_resumed = await event_handler.resolve_event(event_id, response.response)
|
|
134
|
+
return EventResolutionResponse(
|
|
135
|
+
event_id=event_id,
|
|
136
|
+
status="resolved",
|
|
137
|
+
session_resumed=session_resumed,
|
|
138
|
+
)
|
|
139
|
+
except KeyError as e:
|
|
140
|
+
raise HTTPException(
|
|
141
|
+
status_code=404, detail=f"Event not found: {event_id}"
|
|
142
|
+
) from e
|
|
143
|
+
except Exception as e:
|
|
144
|
+
raise HTTPException(
|
|
145
|
+
status_code=500, detail=f"Failed to resolve event: {e!s}"
|
|
146
|
+
) from e
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
@router.get("/events/pending", response_model=List[PendingEventResponse])
|
|
150
|
+
async def get_pending_events(
|
|
151
|
+
project_id: Optional[str] = Query(None, description="Filter by project ID"),
|
|
152
|
+
event_handler=Depends(get_event_handler),
|
|
153
|
+
) -> List[PendingEventResponse]:
|
|
154
|
+
"""Get pending events requiring resolution.
|
|
155
|
+
|
|
156
|
+
Returns all unresolved events, optionally filtered by project.
|
|
157
|
+
Events are sorted by priority (high to low) then created time (old to new).
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
project_id: If provided, only return events for this project
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
List of pending events
|
|
164
|
+
|
|
165
|
+
Example:
|
|
166
|
+
GET /api/events/pending
|
|
167
|
+
GET /api/events/pending?project_id=proj_123
|
|
168
|
+
"""
|
|
169
|
+
events = await event_handler.get_pending_events(project_id)
|
|
170
|
+
|
|
171
|
+
return [
|
|
172
|
+
PendingEventResponse(
|
|
173
|
+
event_id=event.id,
|
|
174
|
+
project_id=event.project_id,
|
|
175
|
+
event_type=event.type.value,
|
|
176
|
+
priority=event.priority.value,
|
|
177
|
+
status=event.status.value,
|
|
178
|
+
title=event.title,
|
|
179
|
+
content=event.content,
|
|
180
|
+
options=event.options,
|
|
181
|
+
is_blocking=event_handler.is_blocking(event),
|
|
182
|
+
)
|
|
183
|
+
for event in events
|
|
184
|
+
]
|