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
|
@@ -7,7 +7,7 @@ Shows welcome message, version info, ASCII art, and what's new section.
|
|
|
7
7
|
import os
|
|
8
8
|
import re
|
|
9
9
|
import shutil
|
|
10
|
-
import subprocess
|
|
10
|
+
import subprocess # nosec B404 - required for git operations
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
from typing import List
|
|
13
13
|
|
|
@@ -65,8 +65,8 @@ def _get_recent_commits(max_commits: int = 3) -> List[str]:
|
|
|
65
65
|
if not is_git_repository("."):
|
|
66
66
|
return []
|
|
67
67
|
|
|
68
|
-
# Run git log with custom format
|
|
69
|
-
result = subprocess.run(
|
|
68
|
+
# Run git log with custom format (safe - no user input)
|
|
69
|
+
result = subprocess.run( # nosec B603 B607
|
|
70
70
|
["git", "log", "--format=%h • %ar • %s", f"-{max_commits}"],
|
|
71
71
|
capture_output=True,
|
|
72
72
|
text=True,
|
|
@@ -216,6 +216,59 @@ def _get_cwd_display(max_width: int = 40) -> str:
|
|
|
216
216
|
return "..." + cwd[-(max_width - 3) :]
|
|
217
217
|
|
|
218
218
|
|
|
219
|
+
def _count_mpm_skills() -> int:
|
|
220
|
+
"""
|
|
221
|
+
Count user-level MPM skills from ~/.claude/skills/.
|
|
222
|
+
|
|
223
|
+
Returns:
|
|
224
|
+
Number of skill directories with SKILL.md files
|
|
225
|
+
"""
|
|
226
|
+
try:
|
|
227
|
+
user_skills_dir = Path.home() / ".claude" / "skills"
|
|
228
|
+
if not user_skills_dir.exists():
|
|
229
|
+
return 0
|
|
230
|
+
|
|
231
|
+
# Count directories with SKILL.md (skill directories)
|
|
232
|
+
skill_count = 0
|
|
233
|
+
for item in user_skills_dir.iterdir():
|
|
234
|
+
if item.is_dir():
|
|
235
|
+
skill_file = item / "SKILL.md"
|
|
236
|
+
if skill_file.exists():
|
|
237
|
+
skill_count += 1
|
|
238
|
+
# Also count standalone .md files (legacy format)
|
|
239
|
+
elif item.is_file() and item.suffix == ".md" and item.name != "README.md":
|
|
240
|
+
skill_count += 1
|
|
241
|
+
|
|
242
|
+
return skill_count
|
|
243
|
+
except Exception:
|
|
244
|
+
# Silent failure - return 0 if any error
|
|
245
|
+
return 0
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def _count_deployed_agents() -> int:
|
|
249
|
+
"""
|
|
250
|
+
Count deployed agents from .claude/agents/.
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
Number of deployed agent files
|
|
254
|
+
"""
|
|
255
|
+
try:
|
|
256
|
+
deploy_target = Path.cwd() / ".claude" / "agents"
|
|
257
|
+
if not deploy_target.exists():
|
|
258
|
+
return 0
|
|
259
|
+
|
|
260
|
+
# Count .md files, excluding README and other docs
|
|
261
|
+
agent_files = [
|
|
262
|
+
f
|
|
263
|
+
for f in deploy_target.glob("*.md")
|
|
264
|
+
if not f.name.startswith(("README", "INSTRUCTIONS", "."))
|
|
265
|
+
]
|
|
266
|
+
return len(agent_files)
|
|
267
|
+
except Exception:
|
|
268
|
+
# Silent failure - return 0 if any error
|
|
269
|
+
return 0
|
|
270
|
+
|
|
271
|
+
|
|
219
272
|
def _format_two_column_line(
|
|
220
273
|
left: str, right: str, left_panel_width: int, right_panel_width: int
|
|
221
274
|
) -> str:
|
|
@@ -402,11 +455,25 @@ def display_startup_banner(version: str, logging_level: str) -> None:
|
|
|
402
455
|
)
|
|
403
456
|
)
|
|
404
457
|
|
|
405
|
-
# Line 10: Model info | separator
|
|
458
|
+
# Line 10: Model info with counts | separator
|
|
406
459
|
separator = "─" * right_panel_width
|
|
460
|
+
agent_count = _count_deployed_agents()
|
|
461
|
+
skill_count = _count_mpm_skills()
|
|
462
|
+
|
|
463
|
+
# Format: "Sonnet 4.5 · 44 agents, 19 skills"
|
|
464
|
+
if agent_count > 0 or skill_count > 0:
|
|
465
|
+
counts_text = []
|
|
466
|
+
if agent_count > 0:
|
|
467
|
+
counts_text.append(f"{agent_count} agent{'s' if agent_count != 1 else ''}")
|
|
468
|
+
if skill_count > 0:
|
|
469
|
+
counts_text.append(f"{skill_count} skill{'s' if skill_count != 1 else ''}")
|
|
470
|
+
model_info = f"Sonnet 4.5 · {', '.join(counts_text)}"
|
|
471
|
+
else:
|
|
472
|
+
model_info = "Sonnet 4.5 · Claude MPM"
|
|
473
|
+
|
|
407
474
|
lines.append(
|
|
408
475
|
_format_two_column_line(
|
|
409
|
-
|
|
476
|
+
model_info, separator, left_panel_width, right_panel_width
|
|
410
477
|
)
|
|
411
478
|
)
|
|
412
479
|
|
|
@@ -464,7 +531,7 @@ def should_show_banner(args) -> bool:
|
|
|
464
531
|
"""
|
|
465
532
|
Determine if startup banner should be displayed.
|
|
466
533
|
|
|
467
|
-
Skip banner for: --help, --version, info, doctor, config, configure commands
|
|
534
|
+
Skip banner for: --help, --version, info, doctor, config, configure, oauth commands
|
|
468
535
|
"""
|
|
469
536
|
# Check for help/version flags
|
|
470
537
|
if hasattr(args, "help") and args.help:
|
|
@@ -473,7 +540,9 @@ def should_show_banner(args) -> bool:
|
|
|
473
540
|
return False
|
|
474
541
|
|
|
475
542
|
# Check for commands that should skip banner
|
|
476
|
-
|
|
543
|
+
# Commander has its own banner, so skip the main MPM banner
|
|
544
|
+
# OAuth commands are lightweight utilities that should run immediately
|
|
545
|
+
skip_commands = {"info", "doctor", "config", "configure", "commander", "oauth"}
|
|
477
546
|
if hasattr(args, "command") and args.command in skip_commands:
|
|
478
547
|
return False
|
|
479
548
|
|
|
@@ -672,7 +672,7 @@ async def trigger_vector_search_indexing(project_root: Optional[Path] = None) ->
|
|
|
672
672
|
# Using installed binary
|
|
673
673
|
cmd = [vector_search_path, "index", str(project_root)]
|
|
674
674
|
|
|
675
|
-
logger.
|
|
675
|
+
logger.debug(
|
|
676
676
|
"MCP Vector Search: Starting background indexing for improved code search"
|
|
677
677
|
)
|
|
678
678
|
|
|
@@ -761,7 +761,7 @@ def _start_vector_search_subprocess(project_root: Optional[Path] = None) -> None
|
|
|
761
761
|
else:
|
|
762
762
|
cmd = [vector_search_path, "index", str(project_root)]
|
|
763
763
|
|
|
764
|
-
logger.
|
|
764
|
+
logger.debug(
|
|
765
765
|
"MCP Vector Search: Starting background indexing for improved code search"
|
|
766
766
|
)
|
|
767
767
|
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Startup migrations for claude-mpm.
|
|
3
|
+
|
|
4
|
+
This module provides a migration registry pattern for automatically fixing
|
|
5
|
+
configuration issues on first startup after an update. Migrations run once
|
|
6
|
+
and are tracked in ~/.claude-mpm/migrations.yaml.
|
|
7
|
+
|
|
8
|
+
Design Principles:
|
|
9
|
+
- Non-blocking: Failures log warnings but don't stop startup
|
|
10
|
+
- Idempotent: Safe to run multiple times (check before migrate)
|
|
11
|
+
- Tracked: Each migration runs only once per installation
|
|
12
|
+
- Early: Runs before agent sync in startup sequence
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import shutil
|
|
16
|
+
from dataclasses import dataclass
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import Callable
|
|
20
|
+
|
|
21
|
+
import yaml
|
|
22
|
+
|
|
23
|
+
from ..core.logging_utils import get_logger
|
|
24
|
+
|
|
25
|
+
logger = get_logger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass
|
|
29
|
+
class Migration:
|
|
30
|
+
"""Definition of a startup migration."""
|
|
31
|
+
|
|
32
|
+
id: str
|
|
33
|
+
description: str
|
|
34
|
+
check: Callable[[], bool] # Returns True if migration is needed
|
|
35
|
+
migrate: Callable[[], bool] # Returns True if migration succeeded
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _get_migrations_file() -> Path:
|
|
39
|
+
"""Get path to migrations tracking file."""
|
|
40
|
+
return Path.home() / ".claude-mpm" / "migrations.yaml"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _load_completed_migrations() -> dict:
|
|
44
|
+
"""Load completed migrations from tracking file.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
Dictionary with completed migrations data.
|
|
48
|
+
"""
|
|
49
|
+
migrations_file = _get_migrations_file()
|
|
50
|
+
if not migrations_file.exists():
|
|
51
|
+
return {"migrations": []}
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
with open(migrations_file) as f:
|
|
55
|
+
data = yaml.safe_load(f) or {}
|
|
56
|
+
return data if "migrations" in data else {"migrations": []}
|
|
57
|
+
except Exception as e:
|
|
58
|
+
logger.debug(f"Failed to load migrations file: {e}")
|
|
59
|
+
return {"migrations": []}
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _save_completed_migration(migration_id: str) -> None:
|
|
63
|
+
"""Save a completed migration to tracking file.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
migration_id: The ID of the completed migration.
|
|
67
|
+
"""
|
|
68
|
+
migrations_file = _get_migrations_file()
|
|
69
|
+
migrations_file.parent.mkdir(parents=True, exist_ok=True)
|
|
70
|
+
|
|
71
|
+
data = _load_completed_migrations()
|
|
72
|
+
|
|
73
|
+
# Add new migration entry
|
|
74
|
+
data["migrations"].append(
|
|
75
|
+
{"id": migration_id, "completed_at": datetime.now(timezone.utc).isoformat()}
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
with open(migrations_file, "w") as f:
|
|
80
|
+
yaml.safe_dump(data, f, default_flow_style=False)
|
|
81
|
+
except Exception as e:
|
|
82
|
+
logger.warning(f"Failed to save migration tracking: {e}")
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _is_migration_completed(migration_id: str) -> bool:
|
|
86
|
+
"""Check if a migration has already been completed.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
migration_id: The ID of the migration to check.
|
|
90
|
+
|
|
91
|
+
Returns:
|
|
92
|
+
True if the migration has been completed.
|
|
93
|
+
"""
|
|
94
|
+
data = _load_completed_migrations()
|
|
95
|
+
completed_ids = [m.get("id") for m in data.get("migrations", [])]
|
|
96
|
+
return migration_id in completed_ids
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
# =============================================================================
|
|
100
|
+
# Migration: v5.6.76-cache-dir-rename
|
|
101
|
+
# =============================================================================
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _check_cache_dir_rename_needed() -> bool:
|
|
105
|
+
"""Check if cache directory rename is needed.
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
True if ~/.claude-mpm/cache/remote-agents/ exists.
|
|
109
|
+
"""
|
|
110
|
+
old_cache_dir = Path.home() / ".claude-mpm" / "cache" / "remote-agents"
|
|
111
|
+
return old_cache_dir.exists()
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def _migrate_cache_dir_rename() -> bool:
|
|
115
|
+
"""Rename remote-agents cache directory to agents.
|
|
116
|
+
|
|
117
|
+
This migration:
|
|
118
|
+
1. Moves ~/.claude-mpm/cache/remote-agents/ contents to ~/.claude-mpm/cache/agents/
|
|
119
|
+
2. Removes the old remote-agents directory
|
|
120
|
+
3. Updates configuration.yaml if it references the old path
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
True if migration succeeded.
|
|
124
|
+
"""
|
|
125
|
+
old_cache_dir = Path.home() / ".claude-mpm" / "cache" / "remote-agents"
|
|
126
|
+
new_cache_dir = Path.home() / ".claude-mpm" / "cache" / "agents"
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
# Step 1: Move directory contents
|
|
130
|
+
if old_cache_dir.exists():
|
|
131
|
+
# Ensure parent directory exists
|
|
132
|
+
new_cache_dir.parent.mkdir(parents=True, exist_ok=True)
|
|
133
|
+
|
|
134
|
+
if new_cache_dir.exists():
|
|
135
|
+
# Merge: move contents from old to new
|
|
136
|
+
for item in old_cache_dir.iterdir():
|
|
137
|
+
dest = new_cache_dir / item.name
|
|
138
|
+
if not dest.exists():
|
|
139
|
+
shutil.move(str(item), str(dest))
|
|
140
|
+
# Remove old directory after moving contents
|
|
141
|
+
shutil.rmtree(old_cache_dir, ignore_errors=True)
|
|
142
|
+
else:
|
|
143
|
+
# Simple rename if new dir doesn't exist
|
|
144
|
+
shutil.move(str(old_cache_dir), str(new_cache_dir))
|
|
145
|
+
|
|
146
|
+
logger.debug(
|
|
147
|
+
f"Moved cache directory from {old_cache_dir} to {new_cache_dir}"
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# Step 2: Update configuration.yaml if needed
|
|
151
|
+
_update_configuration_cache_path()
|
|
152
|
+
|
|
153
|
+
return True
|
|
154
|
+
|
|
155
|
+
except Exception as e:
|
|
156
|
+
logger.warning(f"Cache directory migration failed: {e}")
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def _update_configuration_cache_path() -> None:
|
|
161
|
+
"""Update configuration.yaml to use new cache path if it references old path."""
|
|
162
|
+
config_file = Path.home() / ".claude-mpm" / "configuration.yaml"
|
|
163
|
+
if not config_file.exists():
|
|
164
|
+
return
|
|
165
|
+
|
|
166
|
+
try:
|
|
167
|
+
with open(config_file) as f:
|
|
168
|
+
content = f.read()
|
|
169
|
+
|
|
170
|
+
old_path_pattern = "/.claude-mpm/cache/remote-agents"
|
|
171
|
+
new_path_pattern = "/.claude-mpm/cache/agents"
|
|
172
|
+
|
|
173
|
+
if old_path_pattern in content:
|
|
174
|
+
updated_content = content.replace(old_path_pattern, new_path_pattern)
|
|
175
|
+
with open(config_file, "w") as f:
|
|
176
|
+
f.write(updated_content)
|
|
177
|
+
logger.debug("Updated configuration.yaml cache_dir path")
|
|
178
|
+
|
|
179
|
+
except Exception as e:
|
|
180
|
+
logger.debug(f"Failed to update configuration.yaml: {e}")
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
# =============================================================================
|
|
184
|
+
# Migration Registry
|
|
185
|
+
# =============================================================================
|
|
186
|
+
|
|
187
|
+
MIGRATIONS: list[Migration] = [
|
|
188
|
+
Migration(
|
|
189
|
+
id="v5.6.76-cache-dir-rename",
|
|
190
|
+
description="Rename remote-agents cache dir to agents",
|
|
191
|
+
check=_check_cache_dir_rename_needed,
|
|
192
|
+
migrate=_migrate_cache_dir_rename,
|
|
193
|
+
),
|
|
194
|
+
]
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def run_migrations() -> None:
|
|
198
|
+
"""Run all pending startup migrations.
|
|
199
|
+
|
|
200
|
+
This function:
|
|
201
|
+
1. Iterates through the migration registry
|
|
202
|
+
2. Skips already-completed migrations
|
|
203
|
+
3. Checks if each migration is needed
|
|
204
|
+
4. Runs the migration if needed
|
|
205
|
+
5. Tracks completed migrations
|
|
206
|
+
|
|
207
|
+
Errors are logged but do not stop startup.
|
|
208
|
+
"""
|
|
209
|
+
for migration in MIGRATIONS:
|
|
210
|
+
try:
|
|
211
|
+
# Skip if already completed
|
|
212
|
+
if _is_migration_completed(migration.id):
|
|
213
|
+
continue
|
|
214
|
+
|
|
215
|
+
# Check if migration is needed
|
|
216
|
+
if not migration.check():
|
|
217
|
+
# Mark as completed even if not needed (condition doesn't apply)
|
|
218
|
+
_save_completed_migration(migration.id)
|
|
219
|
+
continue
|
|
220
|
+
|
|
221
|
+
# Run the migration
|
|
222
|
+
print(f"⚙️ Running startup migration: {migration.description}")
|
|
223
|
+
logger.info(f"Running startup migration: {migration.id}")
|
|
224
|
+
|
|
225
|
+
success = migration.migrate()
|
|
226
|
+
|
|
227
|
+
if success:
|
|
228
|
+
_save_completed_migration(migration.id)
|
|
229
|
+
logger.info(f"Migration {migration.id} completed successfully")
|
|
230
|
+
else:
|
|
231
|
+
logger.warning(f"Migration {migration.id} failed")
|
|
232
|
+
|
|
233
|
+
except Exception as e:
|
|
234
|
+
# Non-blocking: log and continue
|
|
235
|
+
logger.warning(f"Migration {migration.id} error: {e}")
|
|
236
|
+
continue
|
claude_mpm/cli/utils.py
CHANGED
|
@@ -107,7 +107,7 @@ def get_agent_versions_display() -> Optional[str]:
|
|
|
107
107
|
base_version_tuple
|
|
108
108
|
)
|
|
109
109
|
output_lines.append(f"\n Base Agent Version: {base_version_str}")
|
|
110
|
-
except Exception:
|
|
110
|
+
except Exception: # nosec B110 - intentional: version display is optional
|
|
111
111
|
pass
|
|
112
112
|
|
|
113
113
|
# Check for agents needing migration
|
|
@@ -173,8 +173,12 @@ def setup_logging(args) -> object:
|
|
|
173
173
|
if not hasattr(args, "logging") or args.logging is None:
|
|
174
174
|
args.logging = LogLevel.OFF.value
|
|
175
175
|
|
|
176
|
+
# Handle deprecated --verbose flag
|
|
177
|
+
if hasattr(args, "verbose") and args.verbose and args.logging == LogLevel.OFF.value:
|
|
178
|
+
args.logging = LogLevel.INFO.value
|
|
179
|
+
|
|
176
180
|
# Handle deprecated --debug flag
|
|
177
|
-
if hasattr(args, "debug") and args.debug
|
|
181
|
+
if hasattr(args, "debug") and args.debug:
|
|
178
182
|
args.logging = LogLevel.DEBUG.value
|
|
179
183
|
|
|
180
184
|
# Only setup logging if not OFF
|
|
@@ -204,7 +208,7 @@ def ensure_directories() -> None:
|
|
|
204
208
|
from ..init import ensure_directories as init_ensure_directories
|
|
205
209
|
|
|
206
210
|
init_ensure_directories()
|
|
207
|
-
except Exception:
|
|
211
|
+
except Exception: # nosec B110
|
|
208
212
|
# Continue even if initialization fails
|
|
209
213
|
# The individual commands will handle missing directories as needed
|
|
210
214
|
pass
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""MPM Commander - Multi-Project Orchestration.
|
|
2
|
+
|
|
3
|
+
This module provides the core infrastructure for managing multiple projects
|
|
4
|
+
with isolated state, work queues, and tool sessions.
|
|
5
|
+
|
|
6
|
+
Key Components:
|
|
7
|
+
- ProjectRegistry: Thread-safe project management
|
|
8
|
+
- Project models: Data structures for state and sessions
|
|
9
|
+
- TmuxOrchestrator: Tmux session and pane management
|
|
10
|
+
- Config loading: .claude-mpm/ directory configuration
|
|
11
|
+
- CommanderDaemon: Main daemon process for orchestration
|
|
12
|
+
- ProjectSession: Per-project lifecycle management
|
|
13
|
+
- InstanceManager: Framework selection and instance lifecycle
|
|
14
|
+
- Frameworks: Claude Code, MPM framework abstractions
|
|
15
|
+
- Memory: Conversation storage, semantic search, context compression
|
|
16
|
+
|
|
17
|
+
Example:
|
|
18
|
+
>>> from claude_mpm.commander import ProjectRegistry
|
|
19
|
+
>>> registry = ProjectRegistry()
|
|
20
|
+
>>> project = registry.register("/path/to/project")
|
|
21
|
+
>>> registry.update_state(project.id, ProjectState.WORKING)
|
|
22
|
+
|
|
23
|
+
>>> # Memory integration
|
|
24
|
+
>>> from claude_mpm.commander.memory import MemoryIntegration
|
|
25
|
+
>>> memory = MemoryIntegration.create()
|
|
26
|
+
>>> await memory.capture_project_conversation(project)
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from claude_mpm.commander.config import DaemonConfig
|
|
30
|
+
from claude_mpm.commander.config_loader import load_project_config
|
|
31
|
+
from claude_mpm.commander.daemon import CommanderDaemon
|
|
32
|
+
from claude_mpm.commander.frameworks import (
|
|
33
|
+
BaseFramework,
|
|
34
|
+
ClaudeCodeFramework,
|
|
35
|
+
InstanceInfo,
|
|
36
|
+
MPMFramework,
|
|
37
|
+
)
|
|
38
|
+
from claude_mpm.commander.instance_manager import (
|
|
39
|
+
FrameworkNotFoundError,
|
|
40
|
+
InstanceAlreadyExistsError,
|
|
41
|
+
InstanceManager,
|
|
42
|
+
InstanceNotFoundError,
|
|
43
|
+
)
|
|
44
|
+
from claude_mpm.commander.models import (
|
|
45
|
+
Project,
|
|
46
|
+
ProjectState,
|
|
47
|
+
ThreadMessage,
|
|
48
|
+
ToolSession,
|
|
49
|
+
)
|
|
50
|
+
from claude_mpm.commander.project_session import ProjectSession, SessionState
|
|
51
|
+
from claude_mpm.commander.registry import ProjectRegistry
|
|
52
|
+
from claude_mpm.commander.tmux_orchestrator import (
|
|
53
|
+
TmuxNotFoundError,
|
|
54
|
+
TmuxOrchestrator,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
__all__ = [
|
|
58
|
+
"BaseFramework",
|
|
59
|
+
"ClaudeCodeFramework",
|
|
60
|
+
"CommanderDaemon",
|
|
61
|
+
"DaemonConfig",
|
|
62
|
+
"FrameworkNotFoundError",
|
|
63
|
+
"InstanceAlreadyExistsError",
|
|
64
|
+
"InstanceInfo",
|
|
65
|
+
"InstanceManager",
|
|
66
|
+
"InstanceNotFoundError",
|
|
67
|
+
"MPMFramework",
|
|
68
|
+
"Project",
|
|
69
|
+
"ProjectRegistry",
|
|
70
|
+
"ProjectSession",
|
|
71
|
+
"ProjectState",
|
|
72
|
+
"SessionState",
|
|
73
|
+
"ThreadMessage",
|
|
74
|
+
"TmuxNotFoundError",
|
|
75
|
+
"TmuxOrchestrator",
|
|
76
|
+
"ToolSession",
|
|
77
|
+
"load_project_config",
|
|
78
|
+
]
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""Runtime adapters for MPM Commander.
|
|
2
|
+
|
|
3
|
+
This package provides adapters for different AI coding tools, allowing
|
|
4
|
+
the TmuxOrchestrator to interface with various runtimes in a uniform way.
|
|
5
|
+
|
|
6
|
+
Two types of adapters:
|
|
7
|
+
- RuntimeAdapter: Synchronous parsing and state detection
|
|
8
|
+
- CommunicationAdapter: Async I/O and state management
|
|
9
|
+
|
|
10
|
+
Available Runtime Adapters:
|
|
11
|
+
- ClaudeCodeAdapter: Vanilla Claude Code CLI
|
|
12
|
+
- AuggieAdapter: Auggie with MCP support
|
|
13
|
+
- CodexAdapter: Codex (limited features)
|
|
14
|
+
- MPMAdapter: Full MPM with agents, hooks, skills, monitoring
|
|
15
|
+
|
|
16
|
+
Registry:
|
|
17
|
+
- AdapterRegistry: Centralized adapter management with auto-detection
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from .auggie import AuggieAdapter
|
|
21
|
+
from .base import (
|
|
22
|
+
Capability,
|
|
23
|
+
ParsedResponse,
|
|
24
|
+
RuntimeAdapter,
|
|
25
|
+
RuntimeCapability,
|
|
26
|
+
RuntimeInfo,
|
|
27
|
+
)
|
|
28
|
+
from .claude_code import ClaudeCodeAdapter
|
|
29
|
+
from .codex import CodexAdapter
|
|
30
|
+
from .communication import (
|
|
31
|
+
AdapterResponse,
|
|
32
|
+
AdapterState,
|
|
33
|
+
BaseCommunicationAdapter,
|
|
34
|
+
ClaudeCodeCommunicationAdapter,
|
|
35
|
+
)
|
|
36
|
+
from .mpm import MPMAdapter
|
|
37
|
+
from .registry import AdapterRegistry
|
|
38
|
+
|
|
39
|
+
# Auto-register all adapters
|
|
40
|
+
AdapterRegistry.register("claude-code", ClaudeCodeAdapter)
|
|
41
|
+
AdapterRegistry.register("auggie", AuggieAdapter)
|
|
42
|
+
AdapterRegistry.register("codex", CodexAdapter)
|
|
43
|
+
AdapterRegistry.register("mpm", MPMAdapter)
|
|
44
|
+
|
|
45
|
+
__all__ = [
|
|
46
|
+
"AdapterRegistry",
|
|
47
|
+
"AdapterResponse",
|
|
48
|
+
"AdapterState",
|
|
49
|
+
"AuggieAdapter",
|
|
50
|
+
"BaseCommunicationAdapter",
|
|
51
|
+
"Capability",
|
|
52
|
+
"ClaudeCodeAdapter",
|
|
53
|
+
"ClaudeCodeCommunicationAdapter",
|
|
54
|
+
"CodexAdapter",
|
|
55
|
+
"MPMAdapter",
|
|
56
|
+
"ParsedResponse",
|
|
57
|
+
"RuntimeAdapter",
|
|
58
|
+
"RuntimeCapability",
|
|
59
|
+
"RuntimeInfo",
|
|
60
|
+
]
|