claude-mpm 5.4.85__py3-none-any.whl → 5.6.76__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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +8 -5
- claude_mpm/agents/{CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md → CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md} +14 -6
- claude_mpm/agents/PM_INSTRUCTIONS.md +109 -706
- claude_mpm/agents/WORKFLOW.md +2 -0
- claude_mpm/agents/templates/circuit-breakers.md +26 -17
- claude_mpm/auth/__init__.py +35 -0
- claude_mpm/auth/callback_server.py +328 -0
- claude_mpm/auth/models.py +104 -0
- claude_mpm/auth/oauth_manager.py +266 -0
- claude_mpm/auth/providers/__init__.py +12 -0
- claude_mpm/auth/providers/base.py +165 -0
- claude_mpm/auth/providers/google.py +261 -0
- claude_mpm/auth/token_storage.py +252 -0
- claude_mpm/cli/commands/autotodos.py +566 -0
- claude_mpm/cli/commands/commander.py +216 -0
- claude_mpm/cli/commands/hook_errors.py +60 -60
- claude_mpm/cli/commands/mcp.py +29 -17
- claude_mpm/cli/commands/mcp_command_router.py +39 -0
- claude_mpm/cli/commands/mcp_service_commands.py +304 -0
- claude_mpm/cli/commands/monitor.py +2 -2
- claude_mpm/cli/commands/mpm_init/core.py +2 -2
- claude_mpm/cli/commands/oauth.py +481 -0
- claude_mpm/cli/commands/run.py +35 -3
- claude_mpm/cli/commands/skill_source.py +51 -2
- claude_mpm/cli/commands/skills.py +5 -3
- claude_mpm/cli/executor.py +128 -16
- claude_mpm/cli/helpers.py +1 -1
- claude_mpm/cli/parsers/base_parser.py +84 -1
- claude_mpm/cli/parsers/commander_parser.py +116 -0
- claude_mpm/cli/parsers/mcp_parser.py +79 -0
- claude_mpm/cli/parsers/oauth_parser.py +165 -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 +5 -0
- claude_mpm/cli/startup.py +345 -40
- claude_mpm/cli/startup_display.py +76 -7
- claude_mpm/cli/startup_logging.py +2 -2
- claude_mpm/cli/startup_migrations.py +236 -0
- 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 +149 -0
- claude_mpm/commander/chat/commands.py +124 -0
- claude_mpm/commander/chat/repl.py +1957 -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 +392 -0
- claude_mpm/commander/frameworks/__init__.py +12 -0
- claude_mpm/commander/frameworks/base.py +233 -0
- claude_mpm/commander/frameworks/claude_code.py +58 -0
- claude_mpm/commander/frameworks/mpm.py +57 -0
- claude_mpm/commander/git/__init__.py +5 -0
- claude_mpm/commander/git/worktree_manager.py +212 -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 +868 -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 +127 -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 +403 -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 +362 -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 +8 -0
- claude_mpm/commands/mpm-doctor.md +8 -0
- claude_mpm/commands/mpm-help.md +8 -0
- claude_mpm/commands/mpm-init.md +8 -0
- claude_mpm/commands/mpm-monitor.md +8 -0
- claude_mpm/commands/mpm-organize.md +8 -0
- claude_mpm/commands/mpm-postmortem.md +8 -0
- claude_mpm/commands/mpm-session-resume.md +9 -1
- claude_mpm/commands/mpm-status.md +8 -0
- claude_mpm/commands/mpm-ticket-view.md +8 -0
- claude_mpm/commands/mpm-version.md +8 -0
- claude_mpm/commands/mpm.md +8 -0
- claude_mpm/config/agent_presets.py +8 -7
- claude_mpm/config/skill_sources.py +16 -0
- claude_mpm/constants.py +5 -0
- claude_mpm/core/claude_runner.py +152 -0
- claude_mpm/core/config.py +35 -22
- claude_mpm/core/config_constants.py +74 -9
- claude_mpm/core/constants.py +56 -12
- claude_mpm/core/hook_manager.py +53 -4
- claude_mpm/core/interactive_session.py +5 -4
- claude_mpm/core/logger.py +26 -9
- claude_mpm/core/logging_utils.py +39 -13
- claude_mpm/core/network_config.py +148 -0
- claude_mpm/core/oneshot_session.py +7 -6
- claude_mpm/core/output_style_manager.py +52 -12
- claude_mpm/core/socketio_pool.py +47 -15
- claude_mpm/core/unified_config.py +10 -6
- claude_mpm/core/unified_paths.py +68 -80
- 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/{Cs_tUR18.js → 1WZnGYqX.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CDuw-vjf.js → 67pF3qNn.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bTOqqlTd.js → 6RxdMKe4.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DwBR2MJi.js → 8cZrfX0h.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{ZGh7QtNv.js → 9a6T2nm-.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D9lljYKQ.js → B443AUzu.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{RJiighC3.js → B8AwtY2H.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{uuIeMWc-.js → BF15LAsF.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{D3k0OPJN.js → BRcwIQNr.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CyWMqx4W.js → BV6nKitt.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CiIAseT4.js → BViJ8lZt.js} +5 -5
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CBBdVcY8.js → BcQ-Q0FE.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BovzEFCE.js → Bpyvgze_.js} +1 -1
- 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/{eNVUfhuA.js → C3rbW_a-.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{GYwsonyD.js → C8WYN38h.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BIF9m_hv.js → C9I8FlXH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B0uc0UOD.js → CIQcWgO2.js} +3 -3
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Be7GpZd6.js → CIctN7YN.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Bh0LDWpI.js → CKrS_JZW.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DUrLdbGD.js → CR6P9C4A.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7xVLGWV.js → CRRR9MD_.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dhb8PKl3.js → CSXtMOf0.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BPYeabCQ.js → CT-sbxSk.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{sQeU3Y1z.js → CWm6DJsp.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CnA0NrzZ.js → CpqQ1Kzn.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4B-KCzX.js → D2nGpDRe.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DGkLK5U1.js → D9iCMida.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{BofRWZRR.js → D9ykgMoY.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DmxopI1J.js → DL2Ldur1.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C30mlcqg.js → DPfltzjH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Vzk33B_K.js → DR8nis88.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DI7hHRFL.js → DUliQN2b.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C4JcI4KD.js → DXlhR01x.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{bT1r9zLR.js → D_lyTybS.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DZX00Y4g.js → DngoTTgh.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzZX-COe.js → DqkmHtDC.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{B7RN905-.js → DsDh8EYs.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DLVjFsZ3.js → DypDmXgd.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{iEWssX7S.js → IPYC-LnN.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DaimHw_p.js → JpevfAFt.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{DY1XQ8fi.js → R8CEIRAd.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Dle-35c7.js → Zxy7qc-l.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{C_Usid8X.js → qtd3IeO4.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{CzeYkLYB.js → ulBFON_C.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/{Cfqx1Qun.js → wQVh1CoA.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/{app.D6-I5TpK.js → app.Dr7t0z2J.js} +2 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{0.m1gL8KXf.js → 0.RgBboRvH.js} +1 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/{1.CgNOuw-d.js → 1.DG-KkbDf.js} +1 -1
- 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 -1
- claude_mpm/dashboard/static/svelte-build/index.html +9 -9
- 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/auto_pause_handler.py +485 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +466 -136
- claude_mpm/hooks/claude_hooks/hook_handler.py +204 -104
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
- claude_mpm/hooks/claude_hooks/installer.py +291 -59
- claude_mpm/hooks/claude_hooks/memory_integration.py +52 -32
- claude_mpm/hooks/claude_hooks/response_tracking.py +43 -60
- claude_mpm/hooks/claude_hooks/services/__init__.py +21 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +41 -26
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +38 -105
- claude_mpm/hooks/claude_hooks/services/container.py +326 -0
- claude_mpm/hooks/claude_hooks/services/protocols.py +328 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +25 -38
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +75 -77
- claude_mpm/hooks/session_resume_hook.py +89 -1
- claude_mpm/hooks/templates/pre_tool_use_simple.py +6 -6
- claude_mpm/hooks/templates/pre_tool_use_template.py +16 -8
- claude_mpm/init.py +22 -15
- claude_mpm/mcp/__init__.py +9 -0
- claude_mpm/mcp/google_workspace_server.py +610 -0
- claude_mpm/scripts/claude-hook-handler.sh +46 -19
- claude_mpm/services/agents/agent_recommendation_service.py +8 -8
- claude_mpm/services/agents/agent_selection_service.py +2 -2
- claude_mpm/services/agents/cache_git_manager.py +1 -1
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +3 -0
- claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
- claude_mpm/services/agents/single_tier_deployment_service.py +4 -4
- 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 +44 -26
- claude_mpm/services/delegation_detector.py +175 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +30 -0
- 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_log.py +325 -0
- claude_mpm/services/hook_installer_service.py +77 -8
- 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/mcp_config_manager.py +99 -19
- claude_mpm/services/mcp_service_registry.py +294 -0
- claude_mpm/services/monitor/daemon_manager.py +15 -4
- claude_mpm/services/monitor/management/lifecycle.py +8 -2
- claude_mpm/services/monitor/server.py +111 -16
- claude_mpm/services/pm_skills_deployer.py +261 -87
- claude_mpm/services/skills/git_skill_source_manager.py +130 -10
- claude_mpm/services/skills/selective_skill_deployer.py +142 -16
- claude_mpm/services/skills/skill_discovery_service.py +74 -4
- claude_mpm/services/skills_deployer.py +31 -5
- claude_mpm/services/socketio/handlers/hook.py +14 -7
- claude_mpm/services/socketio/server/main.py +12 -4
- claude_mpm/skills/__init__.py +2 -1
- 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-circuit-breaker-enforcement/SKILL.md +476 -0
- claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
- claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -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-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/{pm-teaching-mode → mpm-teaching-mode}/SKILL.md +2 -2
- claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
- claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
- claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
- claude_mpm/skills/registry.py +295 -90
- claude_mpm/skills/skill_manager.py +4 -4
- claude_mpm-5.6.76.dist-info/METADATA +416 -0
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/RECORD +312 -175
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/WHEEL +1 -1
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/entry_points.txt +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +0 -24
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +0 -323
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +0 -1
- claude_mpm-5.4.85.dist-info/METADATA +0 -1023
- /claude_mpm/skills/bundled/pm/{pm-bug-reporting/pm-bug-reporting.md → mpm-bug-reporting/SKILL.md} +0 -0
- /claude_mpm/skills/bundled/pm/{pm-delegation-patterns → mpm-delegation-patterns}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-git-file-tracking → mpm-git-file-tracking}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-pr-workflow → mpm-pr-workflow}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-ticketing-integration → mpm-ticketing-integration}/SKILL.md +0 -0
- /claude_mpm/skills/bundled/pm/{pm-verification-protocols → mpm-verification-protocols}/SKILL.md +0 -0
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.85.dist-info → claude_mpm-5.6.76.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"""Auggie CLI runtime adapter.
|
|
2
|
+
|
|
3
|
+
This module implements the RuntimeAdapter interface for Auggie,
|
|
4
|
+
an AI coding assistant with MCP (Model Context Protocol) support.
|
|
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 AuggieAdapter(RuntimeAdapter):
|
|
24
|
+
"""Adapter for Auggie CLI.
|
|
25
|
+
|
|
26
|
+
Auggie is an AI coding assistant with support for MCP servers,
|
|
27
|
+
custom instructions, and various tool capabilities.
|
|
28
|
+
|
|
29
|
+
Example:
|
|
30
|
+
>>> adapter = AuggieAdapter()
|
|
31
|
+
>>> cmd = adapter.build_launch_command("/home/user/project")
|
|
32
|
+
>>> print(cmd)
|
|
33
|
+
cd '/home/user/project' && auggie
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
# Idle detection patterns
|
|
37
|
+
IDLE_PATTERNS = [
|
|
38
|
+
r"^>\s*$", # Simple prompt
|
|
39
|
+
r"auggie>\s*$", # Named prompt
|
|
40
|
+
r"Ready for input",
|
|
41
|
+
r"What would you like",
|
|
42
|
+
r"How can I assist",
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
# Error patterns
|
|
46
|
+
ERROR_PATTERNS = [
|
|
47
|
+
r"Error:",
|
|
48
|
+
r"Failed:",
|
|
49
|
+
r"Exception:",
|
|
50
|
+
r"Permission denied",
|
|
51
|
+
r"not found",
|
|
52
|
+
r"Traceback \(most recent call last\)",
|
|
53
|
+
r"FATAL:",
|
|
54
|
+
r"command not found",
|
|
55
|
+
r"cannot access",
|
|
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"Do you want",
|
|
66
|
+
r"\[Y/n\]",
|
|
67
|
+
r"\[yes/no\]",
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
# ANSI escape code pattern
|
|
71
|
+
ANSI_ESCAPE = re.compile(r"\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])")
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def name(self) -> str:
|
|
75
|
+
"""Return the runtime identifier."""
|
|
76
|
+
return "auggie"
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def capabilities(self) -> Set[Capability]:
|
|
80
|
+
"""Return the set of capabilities supported by Auggie."""
|
|
81
|
+
return {
|
|
82
|
+
Capability.TOOL_USE,
|
|
83
|
+
Capability.FILE_EDIT,
|
|
84
|
+
Capability.FILE_CREATE,
|
|
85
|
+
Capability.GIT_OPERATIONS,
|
|
86
|
+
Capability.SHELL_COMMANDS,
|
|
87
|
+
Capability.COMPLEX_REASONING,
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@property
|
|
91
|
+
def runtime_info(self) -> RuntimeInfo:
|
|
92
|
+
"""Return detailed runtime information."""
|
|
93
|
+
return RuntimeInfo(
|
|
94
|
+
name="auggie",
|
|
95
|
+
version=None, # Version detection could be added
|
|
96
|
+
capabilities={
|
|
97
|
+
RuntimeCapability.FILE_READ,
|
|
98
|
+
RuntimeCapability.FILE_EDIT,
|
|
99
|
+
RuntimeCapability.FILE_CREATE,
|
|
100
|
+
RuntimeCapability.BASH_EXECUTION,
|
|
101
|
+
RuntimeCapability.GIT_OPERATIONS,
|
|
102
|
+
RuntimeCapability.TOOL_USE,
|
|
103
|
+
RuntimeCapability.MCP_TOOLS, # Auggie supports MCP
|
|
104
|
+
RuntimeCapability.INSTRUCTIONS,
|
|
105
|
+
RuntimeCapability.COMPLEX_REASONING,
|
|
106
|
+
RuntimeCapability.AGENT_DELEGATION, # Auggie now supports agents
|
|
107
|
+
},
|
|
108
|
+
command="auggie",
|
|
109
|
+
supports_agents=True, # Auggie now supports agent delegation
|
|
110
|
+
instruction_file=".augment/instructions.md",
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
def build_launch_command(
|
|
114
|
+
self, project_path: str, agent_prompt: Optional[str] = None
|
|
115
|
+
) -> str:
|
|
116
|
+
"""Generate shell command to start Auggie.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
project_path: Absolute path to the project directory
|
|
120
|
+
agent_prompt: Optional system prompt to configure Auggie
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
Shell command string ready to execute
|
|
124
|
+
|
|
125
|
+
Example:
|
|
126
|
+
>>> adapter = AuggieAdapter()
|
|
127
|
+
>>> adapter.build_launch_command("/home/user/project")
|
|
128
|
+
"cd '/home/user/project' && auggie"
|
|
129
|
+
"""
|
|
130
|
+
quoted_path = shlex.quote(project_path)
|
|
131
|
+
cmd = f"cd {quoted_path} && auggie"
|
|
132
|
+
|
|
133
|
+
if agent_prompt:
|
|
134
|
+
# Auggie may support --prompt or similar flag
|
|
135
|
+
# Adjust based on actual Auggie CLI options
|
|
136
|
+
quoted_prompt = shlex.quote(agent_prompt)
|
|
137
|
+
cmd += f" --prompt {quoted_prompt}"
|
|
138
|
+
|
|
139
|
+
logger.debug(f"Built Auggie launch command: {cmd}")
|
|
140
|
+
return cmd
|
|
141
|
+
|
|
142
|
+
def format_input(self, message: str) -> str:
|
|
143
|
+
"""Prepare message for Auggie's input format."""
|
|
144
|
+
formatted = message.strip()
|
|
145
|
+
logger.debug(f"Formatted input: {formatted[:100]}...")
|
|
146
|
+
return formatted
|
|
147
|
+
|
|
148
|
+
def strip_ansi(self, text: str) -> str:
|
|
149
|
+
"""Remove ANSI escape codes from text."""
|
|
150
|
+
return self.ANSI_ESCAPE.sub("", text)
|
|
151
|
+
|
|
152
|
+
def detect_idle(self, output: str) -> bool:
|
|
153
|
+
"""Recognize when Auggie is waiting for input."""
|
|
154
|
+
if not output:
|
|
155
|
+
return False
|
|
156
|
+
|
|
157
|
+
clean = self.strip_ansi(output)
|
|
158
|
+
lines = clean.strip().split("\n")
|
|
159
|
+
|
|
160
|
+
if not lines:
|
|
161
|
+
return False
|
|
162
|
+
|
|
163
|
+
last_line = lines[-1].strip()
|
|
164
|
+
|
|
165
|
+
for pattern in self.IDLE_PATTERNS:
|
|
166
|
+
if re.search(pattern, last_line):
|
|
167
|
+
logger.debug(f"Detected idle state with pattern: {pattern}")
|
|
168
|
+
return True
|
|
169
|
+
|
|
170
|
+
return False
|
|
171
|
+
|
|
172
|
+
def detect_error(self, output: str) -> Optional[str]:
|
|
173
|
+
"""Recognize error states and extract error message."""
|
|
174
|
+
clean = self.strip_ansi(output)
|
|
175
|
+
|
|
176
|
+
for pattern in self.ERROR_PATTERNS:
|
|
177
|
+
match = re.search(pattern, clean, re.IGNORECASE)
|
|
178
|
+
if match:
|
|
179
|
+
for line in clean.split("\n"):
|
|
180
|
+
if re.search(pattern, line, re.IGNORECASE):
|
|
181
|
+
error_msg = line.strip()
|
|
182
|
+
logger.warning(f"Detected error: {error_msg}")
|
|
183
|
+
return error_msg
|
|
184
|
+
|
|
185
|
+
return None
|
|
186
|
+
|
|
187
|
+
def detect_question(
|
|
188
|
+
self, output: str
|
|
189
|
+
) -> tuple[bool, Optional[str], Optional[List[str]]]:
|
|
190
|
+
"""Detect if Auggie is asking a question."""
|
|
191
|
+
clean = self.strip_ansi(output)
|
|
192
|
+
|
|
193
|
+
for pattern in self.QUESTION_PATTERNS:
|
|
194
|
+
if re.search(pattern, clean, re.IGNORECASE):
|
|
195
|
+
lines = clean.strip().split("\n")
|
|
196
|
+
question = None
|
|
197
|
+
options = []
|
|
198
|
+
|
|
199
|
+
for line in lines:
|
|
200
|
+
if re.search(pattern, line, re.IGNORECASE):
|
|
201
|
+
question = line.strip()
|
|
202
|
+
|
|
203
|
+
# Look for numbered options
|
|
204
|
+
opt_match = re.match(r"^\s*(\d+)[.):]\s*(.+)$", line)
|
|
205
|
+
if opt_match:
|
|
206
|
+
options.append(opt_match.group(2).strip())
|
|
207
|
+
|
|
208
|
+
logger.debug(
|
|
209
|
+
f"Detected question: {question}, options: {options if options else 'none'}"
|
|
210
|
+
)
|
|
211
|
+
return True, question, options if options else None
|
|
212
|
+
|
|
213
|
+
return False, None, None
|
|
214
|
+
|
|
215
|
+
def parse_response(self, output: str) -> ParsedResponse:
|
|
216
|
+
"""Extract meaningful content from Auggie output."""
|
|
217
|
+
if not output:
|
|
218
|
+
return ParsedResponse(
|
|
219
|
+
content="",
|
|
220
|
+
is_complete=False,
|
|
221
|
+
is_error=False,
|
|
222
|
+
is_question=False,
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
clean = self.strip_ansi(output)
|
|
226
|
+
error_msg = self.detect_error(output)
|
|
227
|
+
is_question, question_text, options = self.detect_question(output)
|
|
228
|
+
is_complete = self.detect_idle(output)
|
|
229
|
+
|
|
230
|
+
response = ParsedResponse(
|
|
231
|
+
content=clean,
|
|
232
|
+
is_complete=is_complete,
|
|
233
|
+
is_error=error_msg is not None,
|
|
234
|
+
error_message=error_msg,
|
|
235
|
+
is_question=is_question,
|
|
236
|
+
question_text=question_text,
|
|
237
|
+
options=options,
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
logger.debug(
|
|
241
|
+
f"Parsed response: complete={is_complete}, error={error_msg is not None}, "
|
|
242
|
+
f"question={is_question}"
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
return response
|
|
246
|
+
|
|
247
|
+
def inject_instructions(self, instructions: str) -> Optional[str]:
|
|
248
|
+
"""Return command to inject custom instructions.
|
|
249
|
+
|
|
250
|
+
Auggie supports .augment/instructions.md file for custom instructions.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
instructions: Instructions text to inject
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
Command to write instructions file
|
|
257
|
+
"""
|
|
258
|
+
# Write to .augment/instructions.md
|
|
259
|
+
escaped = instructions.replace("'", "'\\''")
|
|
260
|
+
return f"mkdir -p .augment && echo '{escaped}' > .augment/instructions.md"
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"""Base runtime adapter interface for MPM Commander.
|
|
2
|
+
|
|
3
|
+
This module defines the abstract interface for runtime adapters that bridge
|
|
4
|
+
between the TmuxOrchestrator and various AI coding tools (Claude Code, Cursor, etc.).
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from abc import ABC, abstractmethod
|
|
8
|
+
from dataclasses import dataclass
|
|
9
|
+
from enum import Enum, auto
|
|
10
|
+
from typing import List, Optional, Set
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Capability(Enum):
|
|
14
|
+
"""Capabilities that a runtime adapter can provide."""
|
|
15
|
+
|
|
16
|
+
TOOL_USE = "tool_use"
|
|
17
|
+
FILE_EDIT = "file_edit"
|
|
18
|
+
FILE_CREATE = "file_create"
|
|
19
|
+
GIT_OPERATIONS = "git_operations"
|
|
20
|
+
SHELL_COMMANDS = "shell_commands"
|
|
21
|
+
WEB_SEARCH = "web_search"
|
|
22
|
+
COMPLEX_REASONING = "complex_reasoning"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class RuntimeCapability(Enum):
|
|
26
|
+
"""Extended capabilities a runtime may support (MPM-specific features)."""
|
|
27
|
+
|
|
28
|
+
FILE_READ = auto()
|
|
29
|
+
FILE_EDIT = auto()
|
|
30
|
+
FILE_CREATE = auto()
|
|
31
|
+
BASH_EXECUTION = auto()
|
|
32
|
+
GIT_OPERATIONS = auto()
|
|
33
|
+
TOOL_USE = auto()
|
|
34
|
+
AGENT_DELEGATION = auto() # Sub-agent spawning
|
|
35
|
+
HOOKS = auto() # Lifecycle hooks
|
|
36
|
+
INSTRUCTIONS = auto() # Custom instructions file
|
|
37
|
+
MCP_TOOLS = auto() # MCP server integration
|
|
38
|
+
SKILLS = auto() # Loadable skills
|
|
39
|
+
MONITOR = auto() # Real-time monitoring
|
|
40
|
+
WEB_SEARCH = auto()
|
|
41
|
+
COMPLEX_REASONING = auto()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass
|
|
45
|
+
class RuntimeInfo:
|
|
46
|
+
"""Information about a runtime environment.
|
|
47
|
+
|
|
48
|
+
Attributes:
|
|
49
|
+
name: Runtime identifier (e.g., "claude-code", "auggie")
|
|
50
|
+
version: Optional version string
|
|
51
|
+
capabilities: Set of RuntimeCapability enums
|
|
52
|
+
command: CLI command to invoke runtime
|
|
53
|
+
supports_agents: Whether runtime supports agent delegation
|
|
54
|
+
instruction_file: Path to instructions file (e.g., "CLAUDE.md")
|
|
55
|
+
|
|
56
|
+
Example:
|
|
57
|
+
>>> info = RuntimeInfo(
|
|
58
|
+
... name="claude-code",
|
|
59
|
+
... version="1.0.0",
|
|
60
|
+
... capabilities={RuntimeCapability.FILE_EDIT, RuntimeCapability.TOOL_USE},
|
|
61
|
+
... command="claude",
|
|
62
|
+
... supports_agents=False,
|
|
63
|
+
... instruction_file="CLAUDE.md"
|
|
64
|
+
... )
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
name: str
|
|
68
|
+
version: Optional[str]
|
|
69
|
+
capabilities: Set[RuntimeCapability]
|
|
70
|
+
command: str
|
|
71
|
+
supports_agents: bool = False
|
|
72
|
+
instruction_file: Optional[str] = None
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@dataclass
|
|
76
|
+
class ParsedResponse:
|
|
77
|
+
"""Parsed output from a runtime tool.
|
|
78
|
+
|
|
79
|
+
Attributes:
|
|
80
|
+
content: The extracted text content, with ANSI codes removed
|
|
81
|
+
is_complete: True if tool is waiting for input (idle state)
|
|
82
|
+
is_error: True if an error was detected in the output
|
|
83
|
+
error_message: The error message if is_error is True
|
|
84
|
+
is_question: True if tool is asking a question
|
|
85
|
+
question_text: The question text if is_question is True
|
|
86
|
+
options: List of options if presenting a choice
|
|
87
|
+
|
|
88
|
+
Example:
|
|
89
|
+
>>> response = ParsedResponse(
|
|
90
|
+
... content="File created successfully",
|
|
91
|
+
... is_complete=True,
|
|
92
|
+
... is_error=False,
|
|
93
|
+
... error_message=None,
|
|
94
|
+
... is_question=False,
|
|
95
|
+
... question_text=None,
|
|
96
|
+
... options=None
|
|
97
|
+
... )
|
|
98
|
+
"""
|
|
99
|
+
|
|
100
|
+
content: str
|
|
101
|
+
is_complete: bool
|
|
102
|
+
is_error: bool
|
|
103
|
+
error_message: Optional[str] = None
|
|
104
|
+
is_question: bool = False
|
|
105
|
+
question_text: Optional[str] = None
|
|
106
|
+
options: Optional[List[str]] = None
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class RuntimeAdapter(ABC):
|
|
110
|
+
"""Abstract base class for runtime adapters.
|
|
111
|
+
|
|
112
|
+
A runtime adapter provides the interface between the TmuxOrchestrator
|
|
113
|
+
and a specific AI coding tool. It handles:
|
|
114
|
+
- Launching the tool with appropriate settings
|
|
115
|
+
- Formatting input messages
|
|
116
|
+
- Detecting tool states (idle, error, questioning)
|
|
117
|
+
- Parsing tool output into structured responses
|
|
118
|
+
|
|
119
|
+
Example:
|
|
120
|
+
>>> class MyAdapter(RuntimeAdapter):
|
|
121
|
+
... @property
|
|
122
|
+
... def name(self) -> str:
|
|
123
|
+
... return "my-tool"
|
|
124
|
+
...
|
|
125
|
+
... def build_launch_command(self, project_path: str) -> str:
|
|
126
|
+
... return f"cd {project_path} && my-tool --interactive"
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
@abstractmethod
|
|
130
|
+
def build_launch_command(
|
|
131
|
+
self, project_path: str, agent_prompt: Optional[str] = None
|
|
132
|
+
) -> str:
|
|
133
|
+
"""Generate shell command to start the tool.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
project_path: Absolute path to the project directory
|
|
137
|
+
agent_prompt: Optional system prompt to configure the agent
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
Shell command string ready to execute
|
|
141
|
+
|
|
142
|
+
Example:
|
|
143
|
+
>>> adapter.build_launch_command("/home/user/project", "You are a Python expert")
|
|
144
|
+
'cd /home/user/project && claude --system-prompt "You are a Python expert"'
|
|
145
|
+
"""
|
|
146
|
+
|
|
147
|
+
@abstractmethod
|
|
148
|
+
def format_input(self, message: str) -> str:
|
|
149
|
+
"""Prepare message for tool's input format.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
message: The user message to send
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Formatted message ready to send to the tool
|
|
156
|
+
|
|
157
|
+
Example:
|
|
158
|
+
>>> adapter.format_input("Fix the bug in main.py")
|
|
159
|
+
'Fix the bug in main.py'
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
@abstractmethod
|
|
163
|
+
def detect_idle(self, output: str) -> bool:
|
|
164
|
+
"""Recognize when tool is waiting for input.
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
output: Raw output from the tool (may contain ANSI codes)
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
True if the tool is in an idle state awaiting input
|
|
171
|
+
|
|
172
|
+
Example:
|
|
173
|
+
>>> adapter.detect_idle("Done editing file.\\n> ")
|
|
174
|
+
True
|
|
175
|
+
>>> adapter.detect_idle("Processing request...")
|
|
176
|
+
False
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
@abstractmethod
|
|
180
|
+
def detect_error(self, output: str) -> Optional[str]:
|
|
181
|
+
"""Recognize error states, return error message if found.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
output: Raw output from the tool
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
Error message string if error detected, None otherwise
|
|
188
|
+
|
|
189
|
+
Example:
|
|
190
|
+
>>> adapter.detect_error("Error: File not found: config.py")
|
|
191
|
+
'Error: File not found: config.py'
|
|
192
|
+
>>> adapter.detect_error("File edited successfully")
|
|
193
|
+
None
|
|
194
|
+
"""
|
|
195
|
+
|
|
196
|
+
@abstractmethod
|
|
197
|
+
def parse_response(self, output: str) -> ParsedResponse:
|
|
198
|
+
"""Extract meaningful content from output.
|
|
199
|
+
|
|
200
|
+
This method combines all detection logic (idle, error, questions)
|
|
201
|
+
into a single structured response.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
output: Raw output from the tool
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
ParsedResponse with all detected states and content
|
|
208
|
+
|
|
209
|
+
Example:
|
|
210
|
+
>>> response = adapter.parse_response("Error: Invalid input\\n> ")
|
|
211
|
+
>>> response.is_error
|
|
212
|
+
True
|
|
213
|
+
>>> response.is_complete
|
|
214
|
+
True
|
|
215
|
+
"""
|
|
216
|
+
|
|
217
|
+
@property
|
|
218
|
+
@abstractmethod
|
|
219
|
+
def capabilities(self) -> Set[Capability]:
|
|
220
|
+
"""What this tool can do.
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
Set of Capability enums indicating supported features
|
|
224
|
+
|
|
225
|
+
Example:
|
|
226
|
+
>>> adapter.capabilities
|
|
227
|
+
{Capability.FILE_EDIT, Capability.TOOL_USE}
|
|
228
|
+
"""
|
|
229
|
+
|
|
230
|
+
@property
|
|
231
|
+
@abstractmethod
|
|
232
|
+
def name(self) -> str:
|
|
233
|
+
"""Runtime identifier.
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
Unique name for this runtime adapter
|
|
237
|
+
|
|
238
|
+
Example:
|
|
239
|
+
>>> adapter.name
|
|
240
|
+
'claude-code'
|
|
241
|
+
"""
|
|
242
|
+
|
|
243
|
+
@property
|
|
244
|
+
def runtime_info(self) -> Optional[RuntimeInfo]:
|
|
245
|
+
"""Return detailed runtime information.
|
|
246
|
+
|
|
247
|
+
Returns:
|
|
248
|
+
RuntimeInfo with capabilities and configuration, or None if not implemented
|
|
249
|
+
|
|
250
|
+
Example:
|
|
251
|
+
>>> info = adapter.runtime_info
|
|
252
|
+
>>> if info and RuntimeCapability.AGENT_DELEGATION in info.capabilities:
|
|
253
|
+
... print("Supports agent delegation")
|
|
254
|
+
"""
|
|
255
|
+
return None
|
|
256
|
+
|
|
257
|
+
def inject_instructions(self, instructions: str) -> Optional[str]:
|
|
258
|
+
"""Return command/method to inject custom instructions.
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
instructions: Instructions text to inject
|
|
262
|
+
|
|
263
|
+
Returns:
|
|
264
|
+
Command string to inject instructions, or None if not supported
|
|
265
|
+
|
|
266
|
+
Example:
|
|
267
|
+
>>> cmd = adapter.inject_instructions("You are a Python expert")
|
|
268
|
+
>>> if cmd:
|
|
269
|
+
... # Execute command to inject instructions
|
|
270
|
+
"""
|
|
271
|
+
return None
|
|
272
|
+
|
|
273
|
+
def inject_agent_context(self, agent_id: str, context: dict) -> Optional[str]:
|
|
274
|
+
"""Return command to inject agent context.
|
|
275
|
+
|
|
276
|
+
Args:
|
|
277
|
+
agent_id: Unique identifier for agent
|
|
278
|
+
context: Context dictionary with agent metadata
|
|
279
|
+
|
|
280
|
+
Returns:
|
|
281
|
+
Command string to inject context, or None if not supported
|
|
282
|
+
|
|
283
|
+
Example:
|
|
284
|
+
>>> cmd = adapter.inject_agent_context("eng-001", {"role": "Engineer"})
|
|
285
|
+
>>> if cmd:
|
|
286
|
+
... # Execute command to inject context
|
|
287
|
+
"""
|
|
288
|
+
return None
|