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,237 @@
|
|
|
1
|
+
"""Codex CLI runtime adapter.
|
|
2
|
+
|
|
3
|
+
This module implements the RuntimeAdapter interface for Codex,
|
|
4
|
+
an AI coding assistant (limited support currently).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import re
|
|
9
|
+
import shlex
|
|
10
|
+
from typing import List, Optional, Set
|
|
11
|
+
|
|
12
|
+
from .base import (
|
|
13
|
+
Capability,
|
|
14
|
+
ParsedResponse,
|
|
15
|
+
RuntimeAdapter,
|
|
16
|
+
RuntimeCapability,
|
|
17
|
+
RuntimeInfo,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class CodexAdapter(RuntimeAdapter):
|
|
24
|
+
"""Adapter for Codex CLI.
|
|
25
|
+
|
|
26
|
+
Codex is an AI coding assistant. This adapter provides basic support,
|
|
27
|
+
with limited capabilities compared to Claude Code or MPM.
|
|
28
|
+
|
|
29
|
+
Note:
|
|
30
|
+
Agent delegation and advanced features not yet supported.
|
|
31
|
+
|
|
32
|
+
Example:
|
|
33
|
+
>>> adapter = CodexAdapter()
|
|
34
|
+
>>> cmd = adapter.build_launch_command("/home/user/project")
|
|
35
|
+
>>> print(cmd)
|
|
36
|
+
cd '/home/user/project' && codex
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
# Idle detection patterns
|
|
40
|
+
IDLE_PATTERNS = [
|
|
41
|
+
r"^>\s*$", # Simple prompt
|
|
42
|
+
r"codex>\s*$", # Named prompt
|
|
43
|
+
r"Ready",
|
|
44
|
+
r"Waiting for input",
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
# Error patterns
|
|
48
|
+
ERROR_PATTERNS = [
|
|
49
|
+
r"Error:",
|
|
50
|
+
r"Failed:",
|
|
51
|
+
r"Exception:",
|
|
52
|
+
r"Permission denied",
|
|
53
|
+
r"not found",
|
|
54
|
+
r"Traceback",
|
|
55
|
+
r"FATAL:",
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
# Question patterns
|
|
59
|
+
QUESTION_PATTERNS = [
|
|
60
|
+
r"Which option",
|
|
61
|
+
r"Should I proceed",
|
|
62
|
+
r"Please choose",
|
|
63
|
+
r"\(y/n\)\?",
|
|
64
|
+
r"Are you sure",
|
|
65
|
+
r"\[Y/n\]",
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
# ANSI escape code pattern
|
|
69
|
+
ANSI_ESCAPE = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])")
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def name(self) -> str:
|
|
73
|
+
"""Return the runtime identifier."""
|
|
74
|
+
return "codex"
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def capabilities(self) -> Set[Capability]:
|
|
78
|
+
"""Return the set of capabilities supported by Codex."""
|
|
79
|
+
return {
|
|
80
|
+
Capability.TOOL_USE,
|
|
81
|
+
Capability.FILE_EDIT,
|
|
82
|
+
Capability.FILE_CREATE,
|
|
83
|
+
Capability.SHELL_COMMANDS,
|
|
84
|
+
Capability.COMPLEX_REASONING,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@property
|
|
88
|
+
def runtime_info(self) -> RuntimeInfo:
|
|
89
|
+
"""Return detailed runtime information."""
|
|
90
|
+
return RuntimeInfo(
|
|
91
|
+
name="codex",
|
|
92
|
+
version=None, # Version detection could be added
|
|
93
|
+
capabilities={
|
|
94
|
+
RuntimeCapability.FILE_READ,
|
|
95
|
+
RuntimeCapability.FILE_EDIT,
|
|
96
|
+
RuntimeCapability.FILE_CREATE,
|
|
97
|
+
RuntimeCapability.BASH_EXECUTION,
|
|
98
|
+
RuntimeCapability.TOOL_USE,
|
|
99
|
+
RuntimeCapability.COMPLEX_REASONING,
|
|
100
|
+
},
|
|
101
|
+
command="codex",
|
|
102
|
+
supports_agents=False, # No agent support
|
|
103
|
+
instruction_file=None, # No custom instructions support
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def build_launch_command(
|
|
107
|
+
self, project_path: str, agent_prompt: Optional[str] = None
|
|
108
|
+
) -> str:
|
|
109
|
+
"""Generate shell command to start Codex.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
project_path: Absolute path to the project directory
|
|
113
|
+
agent_prompt: Optional system prompt (may not be supported)
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Shell command string ready to execute
|
|
117
|
+
|
|
118
|
+
Example:
|
|
119
|
+
>>> adapter = CodexAdapter()
|
|
120
|
+
>>> adapter.build_launch_command("/home/user/project")
|
|
121
|
+
"cd '/home/user/project' && codex"
|
|
122
|
+
"""
|
|
123
|
+
quoted_path = shlex.quote(project_path)
|
|
124
|
+
cmd = f"cd {quoted_path} && codex"
|
|
125
|
+
|
|
126
|
+
# Note: Codex may not support custom prompts
|
|
127
|
+
# Adjust based on actual Codex CLI capabilities
|
|
128
|
+
if agent_prompt:
|
|
129
|
+
logger.warning("Codex may not support custom prompts")
|
|
130
|
+
|
|
131
|
+
logger.debug(f"Built Codex launch command: {cmd}")
|
|
132
|
+
return cmd
|
|
133
|
+
|
|
134
|
+
def format_input(self, message: str) -> str:
|
|
135
|
+
"""Prepare message for Codex's input format."""
|
|
136
|
+
formatted = message.strip()
|
|
137
|
+
logger.debug(f"Formatted input: {formatted[:100]}...")
|
|
138
|
+
return formatted
|
|
139
|
+
|
|
140
|
+
def strip_ansi(self, text: str) -> str:
|
|
141
|
+
"""Remove ANSI escape codes from text."""
|
|
142
|
+
return self.ANSI_ESCAPE.sub("", text)
|
|
143
|
+
|
|
144
|
+
def detect_idle(self, output: str) -> bool:
|
|
145
|
+
"""Recognize when Codex is waiting for input."""
|
|
146
|
+
if not output:
|
|
147
|
+
return False
|
|
148
|
+
|
|
149
|
+
clean = self.strip_ansi(output)
|
|
150
|
+
lines = clean.strip().split("\n")
|
|
151
|
+
|
|
152
|
+
if not lines:
|
|
153
|
+
return False
|
|
154
|
+
|
|
155
|
+
last_line = lines[-1].strip()
|
|
156
|
+
|
|
157
|
+
for pattern in self.IDLE_PATTERNS:
|
|
158
|
+
if re.search(pattern, last_line):
|
|
159
|
+
logger.debug(f"Detected idle state with pattern: {pattern}")
|
|
160
|
+
return True
|
|
161
|
+
|
|
162
|
+
return False
|
|
163
|
+
|
|
164
|
+
def detect_error(self, output: str) -> Optional[str]:
|
|
165
|
+
"""Recognize error states and extract error message."""
|
|
166
|
+
clean = self.strip_ansi(output)
|
|
167
|
+
|
|
168
|
+
for pattern in self.ERROR_PATTERNS:
|
|
169
|
+
match = re.search(pattern, clean, re.IGNORECASE)
|
|
170
|
+
if match:
|
|
171
|
+
for line in clean.split("\n"):
|
|
172
|
+
if re.search(pattern, line, re.IGNORECASE):
|
|
173
|
+
error_msg = line.strip()
|
|
174
|
+
logger.warning(f"Detected error: {error_msg}")
|
|
175
|
+
return error_msg
|
|
176
|
+
|
|
177
|
+
return None
|
|
178
|
+
|
|
179
|
+
def detect_question(
|
|
180
|
+
self, output: str
|
|
181
|
+
) -> tuple[bool, Optional[str], Optional[List[str]]]:
|
|
182
|
+
"""Detect if Codex is asking a question."""
|
|
183
|
+
clean = self.strip_ansi(output)
|
|
184
|
+
|
|
185
|
+
for pattern in self.QUESTION_PATTERNS:
|
|
186
|
+
if re.search(pattern, clean, re.IGNORECASE):
|
|
187
|
+
lines = clean.strip().split("\n")
|
|
188
|
+
question = None
|
|
189
|
+
options = []
|
|
190
|
+
|
|
191
|
+
for line in lines:
|
|
192
|
+
if re.search(pattern, line, re.IGNORECASE):
|
|
193
|
+
question = line.strip()
|
|
194
|
+
|
|
195
|
+
# Look for numbered options
|
|
196
|
+
opt_match = re.match(r"^\s*(\d+)[.):]\s*(.+)$", line)
|
|
197
|
+
if opt_match:
|
|
198
|
+
options.append(opt_match.group(2).strip())
|
|
199
|
+
|
|
200
|
+
logger.debug(
|
|
201
|
+
f"Detected question: {question}, options: {options if options else 'none'}"
|
|
202
|
+
)
|
|
203
|
+
return True, question, options if options else None
|
|
204
|
+
|
|
205
|
+
return False, None, None
|
|
206
|
+
|
|
207
|
+
def parse_response(self, output: str) -> ParsedResponse:
|
|
208
|
+
"""Extract meaningful content from Codex output."""
|
|
209
|
+
if not output:
|
|
210
|
+
return ParsedResponse(
|
|
211
|
+
content="",
|
|
212
|
+
is_complete=False,
|
|
213
|
+
is_error=False,
|
|
214
|
+
is_question=False,
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
clean = self.strip_ansi(output)
|
|
218
|
+
error_msg = self.detect_error(output)
|
|
219
|
+
is_question, question_text, options = self.detect_question(output)
|
|
220
|
+
is_complete = self.detect_idle(output)
|
|
221
|
+
|
|
222
|
+
response = ParsedResponse(
|
|
223
|
+
content=clean,
|
|
224
|
+
is_complete=is_complete,
|
|
225
|
+
is_error=error_msg is not None,
|
|
226
|
+
error_message=error_msg,
|
|
227
|
+
is_question=is_question,
|
|
228
|
+
question_text=question_text,
|
|
229
|
+
options=options,
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
logger.debug(
|
|
233
|
+
f"Parsed response: complete={is_complete}, error={error_msg is not None}, "
|
|
234
|
+
f"question={is_question}"
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
return response
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
"""Communication adapters for managing async I/O with AI coding assistants.
|
|
2
|
+
|
|
3
|
+
This module provides the async communication layer that sits between
|
|
4
|
+
InstanceManager and TmuxOrchestrator, using RuntimeAdapter for parsing.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import asyncio
|
|
8
|
+
import logging
|
|
9
|
+
from abc import ABC, abstractmethod
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from enum import Enum
|
|
12
|
+
from typing import TYPE_CHECKING, AsyncIterator, Optional
|
|
13
|
+
|
|
14
|
+
from claude_mpm.commander.tmux_orchestrator import TmuxOrchestrator
|
|
15
|
+
|
|
16
|
+
from .base import RuntimeAdapter
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from .base import ParsedResponse
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class AdapterState(Enum):
|
|
25
|
+
"""States that a communication adapter can be in."""
|
|
26
|
+
|
|
27
|
+
IDLE = "idle" # Ready for input
|
|
28
|
+
PROCESSING = "processing" # Working on request
|
|
29
|
+
WAITING = "waiting" # Waiting for user input (e.g., permission)
|
|
30
|
+
ERROR = "error" # Error state
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass
|
|
34
|
+
class AdapterResponse:
|
|
35
|
+
"""Response from a communication adapter.
|
|
36
|
+
|
|
37
|
+
Attributes:
|
|
38
|
+
content: The response content
|
|
39
|
+
state: Current adapter state
|
|
40
|
+
tool_uses: List of tools used in response
|
|
41
|
+
files_modified: List of files edited
|
|
42
|
+
is_complete: True if response is complete (prompt returned)
|
|
43
|
+
|
|
44
|
+
Example:
|
|
45
|
+
>>> response = AdapterResponse(
|
|
46
|
+
... content="File created: test.py",
|
|
47
|
+
... state=AdapterState.IDLE,
|
|
48
|
+
... tool_uses=["Write"],
|
|
49
|
+
... files_modified=["test.py"],
|
|
50
|
+
... is_complete=True
|
|
51
|
+
... )
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
content: str
|
|
55
|
+
state: AdapterState
|
|
56
|
+
tool_uses: Optional[list[str]] = None
|
|
57
|
+
files_modified: Optional[list[str]] = None
|
|
58
|
+
is_complete: bool = False
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class BaseCommunicationAdapter(ABC):
|
|
62
|
+
"""Abstract base class for communication adapters.
|
|
63
|
+
|
|
64
|
+
A communication adapter manages the async I/O with an AI coding assistant
|
|
65
|
+
via TmuxOrchestrator, maintaining state and handling streaming responses.
|
|
66
|
+
|
|
67
|
+
Example:
|
|
68
|
+
>>> orchestrator = TmuxOrchestrator()
|
|
69
|
+
>>> adapter = ClaudeCodeCommunicationAdapter(orchestrator, "%0")
|
|
70
|
+
>>> await adapter.send("Fix the bug in main.py")
|
|
71
|
+
>>> response = await adapter.receive()
|
|
72
|
+
>>> print(response.content)
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
@abstractmethod
|
|
76
|
+
async def send(self, message: str) -> None:
|
|
77
|
+
"""Send a message to the assistant.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
message: The message to send
|
|
81
|
+
|
|
82
|
+
Example:
|
|
83
|
+
>>> await adapter.send("Fix the bug in main.py")
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
@abstractmethod
|
|
87
|
+
async def receive(self, timeout: float = 30.0) -> AdapterResponse:
|
|
88
|
+
"""Wait for and return response.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
timeout: Maximum time to wait for response
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
AdapterResponse with parsed content and state
|
|
95
|
+
|
|
96
|
+
Example:
|
|
97
|
+
>>> response = await adapter.receive(timeout=60.0)
|
|
98
|
+
>>> print(response.content)
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
@abstractmethod
|
|
102
|
+
async def interrupt(self) -> bool:
|
|
103
|
+
"""Send interrupt signal (Ctrl+C).
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
True if interrupt was successful
|
|
107
|
+
|
|
108
|
+
Example:
|
|
109
|
+
>>> success = await adapter.interrupt()
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
@abstractmethod
|
|
113
|
+
def is_ready(self) -> bool:
|
|
114
|
+
"""Check if adapter is ready for input.
|
|
115
|
+
|
|
116
|
+
Returns:
|
|
117
|
+
True if adapter is in IDLE state
|
|
118
|
+
|
|
119
|
+
Example:
|
|
120
|
+
>>> if adapter.is_ready():
|
|
121
|
+
... await adapter.send("Next task")
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
@abstractmethod
|
|
125
|
+
async def stream_response(self) -> AsyncIterator[str]:
|
|
126
|
+
"""Stream response chunks as they arrive.
|
|
127
|
+
|
|
128
|
+
Yields:
|
|
129
|
+
Response chunks as they become available
|
|
130
|
+
|
|
131
|
+
Example:
|
|
132
|
+
>>> async for chunk in adapter.stream_response():
|
|
133
|
+
... print(chunk, end='')
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class ClaudeCodeCommunicationAdapter(BaseCommunicationAdapter):
|
|
138
|
+
"""Communication adapter for Claude Code CLI.
|
|
139
|
+
|
|
140
|
+
This adapter manages async I/O with Claude Code via TmuxOrchestrator,
|
|
141
|
+
using ClaudeCodeAdapter (RuntimeAdapter) for output parsing.
|
|
142
|
+
|
|
143
|
+
Attributes:
|
|
144
|
+
orchestrator: TmuxOrchestrator for tmux operations
|
|
145
|
+
pane_target: Tmux pane target (e.g., "%0")
|
|
146
|
+
poll_interval: Polling interval for output capture (seconds)
|
|
147
|
+
|
|
148
|
+
Example:
|
|
149
|
+
>>> orchestrator = TmuxOrchestrator()
|
|
150
|
+
>>> adapter = ClaudeCodeCommunicationAdapter(orchestrator, "%0")
|
|
151
|
+
>>> await adapter.send("Create a new Python file")
|
|
152
|
+
>>> response = await adapter.receive()
|
|
153
|
+
>>> print(response.files_modified)
|
|
154
|
+
['new_file.py']
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
def __init__(
|
|
158
|
+
self,
|
|
159
|
+
orchestrator: TmuxOrchestrator,
|
|
160
|
+
pane_target: str,
|
|
161
|
+
runtime_adapter: RuntimeAdapter,
|
|
162
|
+
poll_interval: float = 0.2,
|
|
163
|
+
):
|
|
164
|
+
"""Initialize the communication adapter.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
orchestrator: TmuxOrchestrator for tmux operations
|
|
168
|
+
pane_target: Tmux pane target (e.g., "%0")
|
|
169
|
+
runtime_adapter: RuntimeAdapter for parsing output
|
|
170
|
+
poll_interval: Polling interval for output capture (seconds)
|
|
171
|
+
"""
|
|
172
|
+
self.orchestrator = orchestrator
|
|
173
|
+
self.pane_target = pane_target
|
|
174
|
+
self.runtime_adapter = runtime_adapter
|
|
175
|
+
self.poll_interval = poll_interval
|
|
176
|
+
self._state = AdapterState.IDLE
|
|
177
|
+
self._last_output = ""
|
|
178
|
+
self._output_buffer = ""
|
|
179
|
+
|
|
180
|
+
async def send(self, message: str) -> None:
|
|
181
|
+
"""Send message to Claude Code.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
message: The message to send
|
|
185
|
+
|
|
186
|
+
Example:
|
|
187
|
+
>>> await adapter.send("Fix the bug in main.py")
|
|
188
|
+
"""
|
|
189
|
+
logger.debug(f"Sending message to {self.pane_target}: {message[:50]}...")
|
|
190
|
+
self._state = AdapterState.PROCESSING
|
|
191
|
+
self._output_buffer = ""
|
|
192
|
+
|
|
193
|
+
# Format message using RuntimeAdapter
|
|
194
|
+
formatted = self.runtime_adapter.format_input(message)
|
|
195
|
+
|
|
196
|
+
# Send via tmux
|
|
197
|
+
self.orchestrator.send_keys(self.pane_target, formatted, enter=True)
|
|
198
|
+
|
|
199
|
+
async def receive(self, timeout: float = 30.0) -> AdapterResponse:
|
|
200
|
+
"""Wait for complete response from Claude Code.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
timeout: Maximum time to wait for response
|
|
204
|
+
|
|
205
|
+
Returns:
|
|
206
|
+
AdapterResponse with parsed content and state
|
|
207
|
+
|
|
208
|
+
Example:
|
|
209
|
+
>>> response = await adapter.receive(timeout=60.0)
|
|
210
|
+
>>> if response.is_complete:
|
|
211
|
+
... print("Task complete!")
|
|
212
|
+
"""
|
|
213
|
+
start = asyncio.get_event_loop().time()
|
|
214
|
+
|
|
215
|
+
while asyncio.get_event_loop().time() - start < timeout:
|
|
216
|
+
# Capture output from tmux pane
|
|
217
|
+
output = self.orchestrator.capture_output(self.pane_target, lines=100)
|
|
218
|
+
|
|
219
|
+
# Get only new output
|
|
220
|
+
new_output = self._get_new_output(output)
|
|
221
|
+
if new_output:
|
|
222
|
+
self._output_buffer += new_output
|
|
223
|
+
|
|
224
|
+
# Parse response using RuntimeAdapter
|
|
225
|
+
parsed = self.runtime_adapter.parse_response(output)
|
|
226
|
+
|
|
227
|
+
# Check if error occurred (prioritize error state)
|
|
228
|
+
if parsed.is_error:
|
|
229
|
+
self._state = AdapterState.ERROR
|
|
230
|
+
logger.warning(f"Error detected: {parsed.error_message}")
|
|
231
|
+
return self._build_response(parsed, is_complete=True)
|
|
232
|
+
|
|
233
|
+
# Check if waiting for user input (question)
|
|
234
|
+
if parsed.is_question:
|
|
235
|
+
self._state = AdapterState.WAITING
|
|
236
|
+
logger.debug(f"Question detected: {parsed.question_text}")
|
|
237
|
+
return self._build_response(parsed, is_complete=False)
|
|
238
|
+
|
|
239
|
+
# Check if response is complete (idle state)
|
|
240
|
+
if parsed.is_complete:
|
|
241
|
+
self._state = AdapterState.IDLE
|
|
242
|
+
logger.debug("Response complete (idle detected)")
|
|
243
|
+
return self._build_response(parsed, is_complete=True)
|
|
244
|
+
|
|
245
|
+
# Continue polling
|
|
246
|
+
await asyncio.sleep(self.poll_interval)
|
|
247
|
+
|
|
248
|
+
# Timeout - return partial response
|
|
249
|
+
logger.warning(f"Timeout after {timeout}s")
|
|
250
|
+
parsed = self.runtime_adapter.parse_response(self._output_buffer)
|
|
251
|
+
return self._build_response(parsed, is_complete=False)
|
|
252
|
+
|
|
253
|
+
async def interrupt(self) -> bool:
|
|
254
|
+
"""Send Ctrl+C to interrupt Claude Code.
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
True if interrupt was successful
|
|
258
|
+
|
|
259
|
+
Example:
|
|
260
|
+
>>> success = await adapter.interrupt()
|
|
261
|
+
>>> if success:
|
|
262
|
+
... print("Interrupted successfully")
|
|
263
|
+
"""
|
|
264
|
+
try:
|
|
265
|
+
logger.info(f"Sending interrupt to {self.pane_target}")
|
|
266
|
+
self.orchestrator.send_keys(self.pane_target, "C-c", enter=False)
|
|
267
|
+
self._state = AdapterState.IDLE
|
|
268
|
+
return True
|
|
269
|
+
except Exception as e:
|
|
270
|
+
logger.error(f"Failed to interrupt: {e}")
|
|
271
|
+
return False
|
|
272
|
+
|
|
273
|
+
def is_ready(self) -> bool:
|
|
274
|
+
"""Check if adapter is ready for input.
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
True if adapter is in IDLE state
|
|
278
|
+
|
|
279
|
+
Example:
|
|
280
|
+
>>> if adapter.is_ready():
|
|
281
|
+
... await adapter.send("Next task")
|
|
282
|
+
"""
|
|
283
|
+
return self._state == AdapterState.IDLE
|
|
284
|
+
|
|
285
|
+
async def stream_response(self) -> AsyncIterator[str]:
|
|
286
|
+
"""Stream response chunks from Claude Code.
|
|
287
|
+
|
|
288
|
+
Yields:
|
|
289
|
+
Response chunks as they become available
|
|
290
|
+
|
|
291
|
+
Example:
|
|
292
|
+
>>> async for chunk in adapter.stream_response():
|
|
293
|
+
... print(chunk, end='', flush=True)
|
|
294
|
+
"""
|
|
295
|
+
last_len = 0
|
|
296
|
+
|
|
297
|
+
while self._state == AdapterState.PROCESSING:
|
|
298
|
+
# Capture current output
|
|
299
|
+
output = self.orchestrator.capture_output(self.pane_target, lines=100)
|
|
300
|
+
|
|
301
|
+
# Get new output since last check and add to buffer
|
|
302
|
+
new_output = self._get_new_output(output)
|
|
303
|
+
if new_output:
|
|
304
|
+
self._output_buffer += new_output
|
|
305
|
+
|
|
306
|
+
# Yield new chunk if buffer grew
|
|
307
|
+
if len(self._output_buffer) > last_len:
|
|
308
|
+
chunk = self._output_buffer[last_len:]
|
|
309
|
+
last_len = len(self._output_buffer)
|
|
310
|
+
yield chunk
|
|
311
|
+
|
|
312
|
+
# Check if complete using RuntimeAdapter
|
|
313
|
+
parsed = self.runtime_adapter.parse_response(output)
|
|
314
|
+
if parsed.is_complete:
|
|
315
|
+
self._state = AdapterState.IDLE
|
|
316
|
+
logger.debug("Streaming complete (idle detected)")
|
|
317
|
+
break
|
|
318
|
+
|
|
319
|
+
await asyncio.sleep(self.poll_interval)
|
|
320
|
+
|
|
321
|
+
def _get_new_output(self, current: str) -> str:
|
|
322
|
+
"""Get only new output since last capture.
|
|
323
|
+
|
|
324
|
+
Args:
|
|
325
|
+
current: Current output from tmux pane
|
|
326
|
+
|
|
327
|
+
Returns:
|
|
328
|
+
New output that hasn't been seen before
|
|
329
|
+
"""
|
|
330
|
+
if current == self._last_output:
|
|
331
|
+
return ""
|
|
332
|
+
|
|
333
|
+
# Find where new content starts
|
|
334
|
+
if self._last_output and current.startswith(self._last_output):
|
|
335
|
+
new = current[len(self._last_output) :]
|
|
336
|
+
else:
|
|
337
|
+
new = current
|
|
338
|
+
|
|
339
|
+
self._last_output = current
|
|
340
|
+
return new
|
|
341
|
+
|
|
342
|
+
def _build_response(
|
|
343
|
+
self,
|
|
344
|
+
parsed: "ParsedResponse",
|
|
345
|
+
is_complete: bool,
|
|
346
|
+
) -> AdapterResponse:
|
|
347
|
+
"""Build AdapterResponse from ParsedResponse.
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
parsed: ParsedResponse from RuntimeAdapter
|
|
351
|
+
is_complete: Whether response is complete
|
|
352
|
+
|
|
353
|
+
Returns:
|
|
354
|
+
AdapterResponse with metadata
|
|
355
|
+
"""
|
|
356
|
+
# TODO: Extract tool uses and files modified from content
|
|
357
|
+
# This would require additional parsing patterns in RuntimeAdapter
|
|
358
|
+
# For now, return basic response
|
|
359
|
+
|
|
360
|
+
return AdapterResponse(
|
|
361
|
+
content=parsed.content,
|
|
362
|
+
state=self._state,
|
|
363
|
+
tool_uses=None, # Future: extract from content
|
|
364
|
+
files_modified=None, # Future: extract from content
|
|
365
|
+
is_complete=is_complete,
|
|
366
|
+
)
|