claude-mpm 5.4.41__py3-none-any.whl → 5.6.72__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/agents/CLAUDE_MPM_OUTPUT_STYLE.md +66 -241
- claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +109 -1925
- claude_mpm/agents/PM_INSTRUCTIONS.md +161 -298
- 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/__init__.py +5 -1
- claude_mpm/cli/commands/agents.py +2 -4
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/autotodos.py +566 -0
- claude_mpm/cli/commands/commander.py +216 -0
- claude_mpm/cli/commands/configure.py +620 -21
- claude_mpm/cli/commands/configure_agent_display.py +3 -1
- 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 +15 -8
- claude_mpm/cli/commands/oauth.py +481 -0
- claude_mpm/cli/commands/profile.py +9 -10
- claude_mpm/cli/commands/run.py +35 -3
- claude_mpm/cli/commands/skill_source.py +51 -2
- claude_mpm/cli/commands/skills.py +182 -32
- claude_mpm/cli/executor.py +129 -16
- claude_mpm/cli/helpers.py +1 -1
- claude_mpm/cli/interactive/__init__.py +10 -0
- claude_mpm/cli/interactive/agent_wizard.py +30 -50
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/parsers/base_parser.py +89 -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/profile_parser.py +0 -1
- 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 +2 -3
- claude_mpm/cli/startup.py +662 -524
- claude_mpm/cli/startup_display.py +76 -7
- 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 +149 -0
- claude_mpm/commander/chat/commands.py +122 -0
- claude_mpm/commander/chat/repl.py +1821 -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 +865 -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 +6 -0
- claude_mpm/core/claude_runner.py +154 -2
- 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 +12 -11
- 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/optimized_startup.py +3 -1
- claude_mpm/core/output_style_manager.py +66 -18
- claude_mpm/core/shared/config_loader.py +3 -1
- claude_mpm/core/socketio_pool.py +47 -15
- claude_mpm/core/unified_config.py +54 -8
- claude_mpm/core/unified_paths.py +95 -90
- 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/{uj46x2Wr.js → BSNlmTZj.js} +1 -1
- 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/{N4qtv3Hx.js → DR8nis88.js} +2 -2
- 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/{DjhvlsAc.js → NqQ1dWOy.js} +1 -1
- 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.CAGBuiOw.js → 0.RgBboRvH.js} +1 -1
- 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 -1
- claude_mpm/dashboard/static/svelte-build/index.html +11 -11
- 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__/auto_pause_handler.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/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/__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__/container.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/protocols.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 +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/kuzu_memory_hook.py +5 -5
- 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 +224 -4
- 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/agent_discovery_service.py +3 -1
- claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
- claude_mpm/services/agents/deployment/agent_template_builder.py +37 -17
- 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 +36 -8
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +50 -26
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/git_source_manager.py +21 -2
- 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/agents/sources/git_source_sync_service.py +116 -5
- claude_mpm/services/agents/startup_sync.py +5 -2
- 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 -3
- claude_mpm/services/monitor/server.py +111 -16
- claude_mpm/services/pm_skills_deployer.py +302 -94
- claude_mpm/services/profile_manager.py +10 -4
- claude_mpm/services/skills/git_skill_source_manager.py +192 -29
- claude_mpm/services/skills/selective_skill_deployer.py +211 -46
- claude_mpm/services/skills/skill_discovery_service.py +74 -4
- claude_mpm/services/skills_deployer.py +192 -70
- 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/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 +29 -23
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/utils/agent_dependency_loader.py +103 -4
- claude_mpm/utils/robust_installer.py +45 -24
- claude_mpm-5.6.72.dist-info/METADATA +416 -0
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/RECORD +477 -159
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/WHEEL +1 -1
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/entry_points.txt +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.B_FtCwCQ.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.Cl_eSA4x.css +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BgChzWQ1.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIXEwuWe.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWc5urbQ.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DMkZpdF2.js +0 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.DTL5mJO-.js +0 -2
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.DzuEhzqh.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DFLC8jdE.js +0 -1
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.DPvEihJJ.js +0 -10
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-311.pyc +0 -0
- claude_mpm-5.4.41.dist-info/METADATA +0 -998
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/licenses/LICENSE-FAQ.md +0 -0
- {claude_mpm-5.4.41.dist-info → claude_mpm-5.6.72.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"""Example usage of Commander memory system.
|
|
2
|
+
|
|
3
|
+
Demonstrates:
|
|
4
|
+
1. Capturing conversations from Project
|
|
5
|
+
2. Searching conversations semantically
|
|
6
|
+
3. Loading context for session resumption
|
|
7
|
+
4. Entity extraction and filtering
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
|
|
12
|
+
from ..models.project import Project, ProjectState, ThreadMessage
|
|
13
|
+
from .entities import EntityType
|
|
14
|
+
from .integration import MemoryIntegration
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async def example_basic_usage():
|
|
18
|
+
"""Example 1: Basic conversation capture and search."""
|
|
19
|
+
print("\n=== Example 1: Basic Usage ===\n")
|
|
20
|
+
|
|
21
|
+
# Initialize memory integration
|
|
22
|
+
memory = MemoryIntegration.create()
|
|
23
|
+
|
|
24
|
+
# Create sample project with conversation
|
|
25
|
+
project = Project(
|
|
26
|
+
id="proj-example-123",
|
|
27
|
+
path="/Users/masa/Projects/example-app",
|
|
28
|
+
name="example-app",
|
|
29
|
+
state=ProjectState.IDLE,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Add sample conversation to project
|
|
33
|
+
project.thread = [
|
|
34
|
+
ThreadMessage(
|
|
35
|
+
id="msg-1",
|
|
36
|
+
role="user",
|
|
37
|
+
content="Fix the login authentication bug in src/auth.py",
|
|
38
|
+
),
|
|
39
|
+
ThreadMessage(
|
|
40
|
+
id="msg-2",
|
|
41
|
+
role="assistant",
|
|
42
|
+
content="I'll investigate the authentication bug. Let me read the auth.py file.",
|
|
43
|
+
),
|
|
44
|
+
ThreadMessage(
|
|
45
|
+
id="msg-3",
|
|
46
|
+
role="assistant",
|
|
47
|
+
content="Found the issue in UserService.authenticate() - the token validation was missing expiry check. Fixed it.",
|
|
48
|
+
),
|
|
49
|
+
ThreadMessage(
|
|
50
|
+
id="msg-4",
|
|
51
|
+
role="user",
|
|
52
|
+
content="Great! Can you also add tests for this fix?",
|
|
53
|
+
),
|
|
54
|
+
ThreadMessage(
|
|
55
|
+
id="msg-5",
|
|
56
|
+
role="assistant",
|
|
57
|
+
content="Added test_token_expiry_validation() in tests/test_auth.py. All tests passing.",
|
|
58
|
+
),
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
# Capture conversation
|
|
62
|
+
conversation = await memory.capture_project_conversation(
|
|
63
|
+
project, instance_name="claude-code-1", session_id="sess-abc123"
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
print(f"✅ Captured conversation: {conversation.id}")
|
|
67
|
+
print(f" Messages: {len(conversation.messages)}")
|
|
68
|
+
print(f" Summary: {conversation.summary}")
|
|
69
|
+
print(
|
|
70
|
+
f" Entities extracted: {len([e for msg in conversation.messages for e in msg.entities])}"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# Search conversations
|
|
74
|
+
print("\n🔍 Searching for 'authentication bug'...")
|
|
75
|
+
results = await memory.search_conversations(
|
|
76
|
+
"authentication bug fix", project_id=project.id, limit=3
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
for i, result in enumerate(results, 1):
|
|
80
|
+
print(f"\n{i}. Score: {result.score:.3f}")
|
|
81
|
+
print(f" Conversation: {result.conversation.id}")
|
|
82
|
+
print(f" Snippet: {result.snippet[:100]}...")
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
async def example_entity_search():
|
|
86
|
+
"""Example 2: Entity-based search and filtering."""
|
|
87
|
+
print("\n=== Example 2: Entity Search ===\n")
|
|
88
|
+
|
|
89
|
+
memory = MemoryIntegration.create()
|
|
90
|
+
|
|
91
|
+
# Create project with file references
|
|
92
|
+
project = Project(
|
|
93
|
+
id="proj-example-456",
|
|
94
|
+
path="/Users/masa/Projects/example-app",
|
|
95
|
+
name="example-app",
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
project.thread = [
|
|
99
|
+
ThreadMessage(
|
|
100
|
+
id="msg-1",
|
|
101
|
+
role="user",
|
|
102
|
+
content="Update the UserService class in src/services/user_service.py",
|
|
103
|
+
),
|
|
104
|
+
ThreadMessage(
|
|
105
|
+
id="msg-2",
|
|
106
|
+
role="assistant",
|
|
107
|
+
content="I'll update UserService.create_user() to include email validation. Also updating tests/test_user_service.py.",
|
|
108
|
+
),
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
# Capture
|
|
112
|
+
conversation = await memory.capture_project_conversation(
|
|
113
|
+
project, instance_name="claude-code-2"
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# Extract entities
|
|
117
|
+
entities = []
|
|
118
|
+
for msg in conversation.messages:
|
|
119
|
+
entities.extend(msg.entities)
|
|
120
|
+
|
|
121
|
+
# Filter by type
|
|
122
|
+
files = memory.extractor.get_unique_values(
|
|
123
|
+
[memory.extractor.Entity.from_dict(e) for e in entities], EntityType.FILE
|
|
124
|
+
)
|
|
125
|
+
print(f"📁 Files mentioned: {files}")
|
|
126
|
+
|
|
127
|
+
classes = memory.extractor.get_unique_values(
|
|
128
|
+
[memory.extractor.Entity.from_dict(e) for e in entities], EntityType.CLASS
|
|
129
|
+
)
|
|
130
|
+
print(f"🏗️ Classes mentioned: {classes}")
|
|
131
|
+
|
|
132
|
+
# Search by entity
|
|
133
|
+
print("\n🔍 Finding conversations that mention 'src/services/user_service.py'...")
|
|
134
|
+
results = await memory.search.search_by_entities(
|
|
135
|
+
EntityType.FILE,
|
|
136
|
+
"src/services/user_service.py",
|
|
137
|
+
project_id=project.id,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
print(f"Found {len(results)} conversations mentioning this file")
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
async def example_context_loading():
|
|
144
|
+
"""Example 3: Load context for session resumption."""
|
|
145
|
+
print("\n=== Example 3: Context Loading for Session Resumption ===\n")
|
|
146
|
+
|
|
147
|
+
memory = MemoryIntegration.create()
|
|
148
|
+
|
|
149
|
+
# Create multiple conversations (simulating historical work)
|
|
150
|
+
project = Project(
|
|
151
|
+
id="proj-example-789",
|
|
152
|
+
path="/Users/masa/Projects/example-app",
|
|
153
|
+
name="example-app",
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# Conversation 1: Week ago
|
|
157
|
+
project.thread = [
|
|
158
|
+
ThreadMessage(
|
|
159
|
+
id="msg-1",
|
|
160
|
+
role="user",
|
|
161
|
+
content="Implement user registration with email verification",
|
|
162
|
+
),
|
|
163
|
+
ThreadMessage(
|
|
164
|
+
id="msg-2",
|
|
165
|
+
role="assistant",
|
|
166
|
+
content="Implemented registration in src/auth.py with email service integration",
|
|
167
|
+
),
|
|
168
|
+
]
|
|
169
|
+
await memory.capture_project_conversation(project, instance_name="claude-code-1")
|
|
170
|
+
|
|
171
|
+
# Conversation 2: Yesterday
|
|
172
|
+
project.thread = [
|
|
173
|
+
ThreadMessage(
|
|
174
|
+
id="msg-3",
|
|
175
|
+
role="user",
|
|
176
|
+
content="Fix the email verification bug - tokens not expiring",
|
|
177
|
+
),
|
|
178
|
+
ThreadMessage(
|
|
179
|
+
id="msg-4",
|
|
180
|
+
role="assistant",
|
|
181
|
+
content="Fixed token expiry check in src/auth.py and added tests",
|
|
182
|
+
),
|
|
183
|
+
]
|
|
184
|
+
await memory.capture_project_conversation(project, instance_name="claude-code-1")
|
|
185
|
+
|
|
186
|
+
# Load context for resumption
|
|
187
|
+
print("📖 Loading context for session resumption...")
|
|
188
|
+
context = await memory.load_context_for_session(
|
|
189
|
+
project.id, max_tokens=4000, limit_conversations=10
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
print(f"✅ Loaded context ({len(context)} chars):\n")
|
|
193
|
+
print(context[:500] + "...\n")
|
|
194
|
+
|
|
195
|
+
print(
|
|
196
|
+
"This context would be injected into the new session to provide historical awareness."
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
async def example_similarity_search():
|
|
201
|
+
"""Example 4: Find similar conversations."""
|
|
202
|
+
print("\n=== Example 4: Similarity Search ===\n")
|
|
203
|
+
|
|
204
|
+
memory = MemoryIntegration.create()
|
|
205
|
+
|
|
206
|
+
# Create project with multiple conversations
|
|
207
|
+
project = Project(
|
|
208
|
+
id="proj-example-999",
|
|
209
|
+
path="/Users/masa/Projects/example-app",
|
|
210
|
+
name="example-app",
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# Reference conversation
|
|
214
|
+
project.thread = [
|
|
215
|
+
ThreadMessage(
|
|
216
|
+
id="msg-1",
|
|
217
|
+
role="user",
|
|
218
|
+
content="Fix the authentication bug in login flow",
|
|
219
|
+
),
|
|
220
|
+
ThreadMessage(
|
|
221
|
+
id="msg-2",
|
|
222
|
+
role="assistant",
|
|
223
|
+
content="Fixed token validation in src/auth.py",
|
|
224
|
+
),
|
|
225
|
+
]
|
|
226
|
+
ref_conv = await memory.capture_project_conversation(project)
|
|
227
|
+
|
|
228
|
+
# Similar conversation
|
|
229
|
+
project.thread = [
|
|
230
|
+
ThreadMessage(
|
|
231
|
+
id="msg-3",
|
|
232
|
+
role="user",
|
|
233
|
+
content="Update the login authentication to use OAuth",
|
|
234
|
+
),
|
|
235
|
+
ThreadMessage(
|
|
236
|
+
id="msg-4",
|
|
237
|
+
role="assistant",
|
|
238
|
+
content="Implemented OAuth in src/auth.py",
|
|
239
|
+
),
|
|
240
|
+
]
|
|
241
|
+
await memory.capture_project_conversation(project)
|
|
242
|
+
|
|
243
|
+
# Different conversation
|
|
244
|
+
project.thread = [
|
|
245
|
+
ThreadMessage(
|
|
246
|
+
id="msg-5",
|
|
247
|
+
role="user",
|
|
248
|
+
content="Add dark mode toggle to the UI",
|
|
249
|
+
),
|
|
250
|
+
ThreadMessage(
|
|
251
|
+
id="msg-6",
|
|
252
|
+
role="assistant",
|
|
253
|
+
content="Added dark mode CSS in styles/theme.css",
|
|
254
|
+
),
|
|
255
|
+
]
|
|
256
|
+
await memory.capture_project_conversation(project)
|
|
257
|
+
|
|
258
|
+
# Find similar
|
|
259
|
+
print(f"🔍 Finding conversations similar to: {ref_conv.id}")
|
|
260
|
+
similar = await memory.search.find_similar(ref_conv.id, limit=3)
|
|
261
|
+
|
|
262
|
+
for i, result in enumerate(similar, 1):
|
|
263
|
+
print(f"\n{i}. Similarity: {result.score:.3f}")
|
|
264
|
+
print(f" Conversation: {result.conversation.id}")
|
|
265
|
+
print(f" Summary: {result.conversation.summary}")
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
async def main():
|
|
269
|
+
"""Run all examples."""
|
|
270
|
+
print("\n" + "=" * 60)
|
|
271
|
+
print("Commander Memory System - Example Usage")
|
|
272
|
+
print("=" * 60)
|
|
273
|
+
|
|
274
|
+
# Run examples
|
|
275
|
+
await example_basic_usage()
|
|
276
|
+
await example_entity_search()
|
|
277
|
+
await example_context_loading()
|
|
278
|
+
await example_similarity_search()
|
|
279
|
+
|
|
280
|
+
print("\n" + "=" * 60)
|
|
281
|
+
print("✅ All examples completed!")
|
|
282
|
+
print("=" * 60 + "\n")
|
|
283
|
+
|
|
284
|
+
print("📚 For more information, see:")
|
|
285
|
+
print(" - src/claude_mpm/commander/memory/README.md")
|
|
286
|
+
print(" - API documentation in each module")
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
if __name__ == "__main__":
|
|
290
|
+
asyncio.run(main())
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
"""Integration helpers for memory system with Commander.
|
|
2
|
+
|
|
3
|
+
Provides high-level functions to integrate conversation memory with
|
|
4
|
+
RuntimeMonitor, Chat CLI, and session resumption workflows.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import uuid
|
|
9
|
+
from datetime import datetime, timezone
|
|
10
|
+
from typing import List, Optional
|
|
11
|
+
|
|
12
|
+
from ..llm.openrouter_client import OpenRouterClient
|
|
13
|
+
from ..models.project import Project, ThreadMessage
|
|
14
|
+
from .compression import ContextCompressor
|
|
15
|
+
from .embeddings import EmbeddingService
|
|
16
|
+
from .entities import EntityExtractor
|
|
17
|
+
from .search import SemanticSearch
|
|
18
|
+
from .store import Conversation, ConversationMessage, ConversationStore
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class MemoryIntegration:
|
|
24
|
+
"""High-level memory integration for Commander.
|
|
25
|
+
|
|
26
|
+
Provides simple API for common memory operations:
|
|
27
|
+
- Capture conversation from Project
|
|
28
|
+
- Search across all conversations
|
|
29
|
+
- Load context for session resume
|
|
30
|
+
|
|
31
|
+
Attributes:
|
|
32
|
+
store: ConversationStore for persistence
|
|
33
|
+
embeddings: EmbeddingService for vectors
|
|
34
|
+
search: SemanticSearch for queries
|
|
35
|
+
compressor: ContextCompressor for summaries
|
|
36
|
+
extractor: EntityExtractor for entity extraction
|
|
37
|
+
|
|
38
|
+
Example:
|
|
39
|
+
>>> memory = MemoryIntegration.create()
|
|
40
|
+
>>> await memory.capture_project_conversation(project)
|
|
41
|
+
>>> results = await memory.search("login bug fix", project_id="proj-xyz")
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(
|
|
45
|
+
self,
|
|
46
|
+
store: ConversationStore,
|
|
47
|
+
embeddings: EmbeddingService,
|
|
48
|
+
search: SemanticSearch,
|
|
49
|
+
compressor: ContextCompressor,
|
|
50
|
+
extractor: EntityExtractor,
|
|
51
|
+
):
|
|
52
|
+
"""Initialize memory integration.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
store: ConversationStore instance
|
|
56
|
+
embeddings: EmbeddingService instance
|
|
57
|
+
search: SemanticSearch instance
|
|
58
|
+
compressor: ContextCompressor instance
|
|
59
|
+
extractor: EntityExtractor instance
|
|
60
|
+
"""
|
|
61
|
+
self.store = store
|
|
62
|
+
self.embeddings = embeddings
|
|
63
|
+
self.search = search
|
|
64
|
+
self.compressor = compressor
|
|
65
|
+
self.extractor = extractor
|
|
66
|
+
|
|
67
|
+
logger.info("MemoryIntegration initialized")
|
|
68
|
+
|
|
69
|
+
@classmethod
|
|
70
|
+
def create(
|
|
71
|
+
cls,
|
|
72
|
+
openrouter_client: Optional[OpenRouterClient] = None,
|
|
73
|
+
embedding_provider: str = "sentence-transformers",
|
|
74
|
+
) -> "MemoryIntegration":
|
|
75
|
+
"""Create MemoryIntegration with default configuration.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
openrouter_client: Optional OpenRouterClient for summarization
|
|
79
|
+
embedding_provider: Embedding provider ("sentence-transformers" or "openai")
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Configured MemoryIntegration instance
|
|
83
|
+
|
|
84
|
+
Example:
|
|
85
|
+
>>> from claude_mpm.commander.llm import OpenRouterClient
|
|
86
|
+
>>> client = OpenRouterClient()
|
|
87
|
+
>>> memory = MemoryIntegration.create(openrouter_client=client)
|
|
88
|
+
"""
|
|
89
|
+
store = ConversationStore()
|
|
90
|
+
embeddings = EmbeddingService(provider=embedding_provider)
|
|
91
|
+
search = SemanticSearch(store, embeddings)
|
|
92
|
+
|
|
93
|
+
# Create OpenRouter client if not provided
|
|
94
|
+
if openrouter_client is None:
|
|
95
|
+
openrouter_client = OpenRouterClient()
|
|
96
|
+
|
|
97
|
+
compressor = ContextCompressor(openrouter_client)
|
|
98
|
+
extractor = EntityExtractor()
|
|
99
|
+
|
|
100
|
+
return cls(store, embeddings, search, compressor, extractor)
|
|
101
|
+
|
|
102
|
+
async def capture_project_conversation(
|
|
103
|
+
self,
|
|
104
|
+
project: Project,
|
|
105
|
+
instance_name: str = "unknown",
|
|
106
|
+
session_id: Optional[str] = None,
|
|
107
|
+
) -> Conversation:
|
|
108
|
+
"""Capture conversation from Project thread.
|
|
109
|
+
|
|
110
|
+
Converts Project.thread (List[ThreadMessage]) into a Conversation
|
|
111
|
+
with entity extraction and optional summarization.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
project: Project with conversation thread
|
|
115
|
+
instance_name: Instance name (e.g., "claude-code-1")
|
|
116
|
+
session_id: Optional session ID
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
Captured and saved Conversation
|
|
120
|
+
|
|
121
|
+
Example:
|
|
122
|
+
>>> conv = await memory.capture_project_conversation(project)
|
|
123
|
+
>>> print(f"Captured conversation {conv.id} with {len(conv.messages)} messages")
|
|
124
|
+
"""
|
|
125
|
+
if not project.thread:
|
|
126
|
+
logger.warning("Project %s has no conversation thread", project.id)
|
|
127
|
+
return None
|
|
128
|
+
|
|
129
|
+
# Convert ThreadMessages to ConversationMessages
|
|
130
|
+
messages = []
|
|
131
|
+
for thread_msg in project.thread:
|
|
132
|
+
conv_msg = ConversationMessage.from_thread_message(thread_msg)
|
|
133
|
+
|
|
134
|
+
# Extract entities
|
|
135
|
+
entities = self.extractor.extract(conv_msg.content)
|
|
136
|
+
conv_msg.entities = [e.to_dict() for e in entities]
|
|
137
|
+
|
|
138
|
+
messages.append(conv_msg)
|
|
139
|
+
|
|
140
|
+
# Create conversation
|
|
141
|
+
conversation = Conversation(
|
|
142
|
+
id=f"conv-{uuid.uuid4().hex[:12]}",
|
|
143
|
+
project_id=project.id,
|
|
144
|
+
instance_name=instance_name,
|
|
145
|
+
session_id=session_id or f"sess-{uuid.uuid4().hex[:8]}",
|
|
146
|
+
messages=messages,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
# Auto-summarize if needed
|
|
150
|
+
if self.compressor.needs_summarization(messages):
|
|
151
|
+
conversation.summary = await self.compressor.summarize(messages)
|
|
152
|
+
logger.info("Auto-generated summary for conversation %s", conversation.id)
|
|
153
|
+
|
|
154
|
+
# Generate embedding for semantic search
|
|
155
|
+
text_for_embedding = conversation.summary or conversation.get_full_text()[:1000]
|
|
156
|
+
conversation.embedding = await self.embeddings.embed(text_for_embedding)
|
|
157
|
+
|
|
158
|
+
# Save to store
|
|
159
|
+
await self.store.save(conversation)
|
|
160
|
+
|
|
161
|
+
logger.info(
|
|
162
|
+
"Captured conversation %s (%d messages) from project %s",
|
|
163
|
+
conversation.id,
|
|
164
|
+
len(messages),
|
|
165
|
+
project.id,
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
return conversation
|
|
169
|
+
|
|
170
|
+
async def search_conversations(
|
|
171
|
+
self,
|
|
172
|
+
query: str,
|
|
173
|
+
project_id: Optional[str] = None,
|
|
174
|
+
limit: int = 10,
|
|
175
|
+
) -> List:
|
|
176
|
+
"""Search conversations by natural language query.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
query: Natural language search query
|
|
180
|
+
project_id: Optional project filter
|
|
181
|
+
limit: Maximum results
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
List of SearchResult with conversations
|
|
185
|
+
|
|
186
|
+
Example:
|
|
187
|
+
>>> results = await memory.search_conversations(
|
|
188
|
+
... "how did we fix the authentication bug?",
|
|
189
|
+
... project_id="proj-xyz",
|
|
190
|
+
... limit=5
|
|
191
|
+
... )
|
|
192
|
+
>>> for result in results:
|
|
193
|
+
... print(f"{result.score:.2f}: {result.snippet}")
|
|
194
|
+
"""
|
|
195
|
+
return await self.search.search(query, project_id=project_id, limit=limit)
|
|
196
|
+
|
|
197
|
+
async def load_context_for_session(
|
|
198
|
+
self,
|
|
199
|
+
project_id: str,
|
|
200
|
+
max_tokens: int = 4000,
|
|
201
|
+
limit_conversations: int = 10,
|
|
202
|
+
) -> str:
|
|
203
|
+
"""Load compressed context for session resumption.
|
|
204
|
+
|
|
205
|
+
Retrieves recent conversations from project and compresses them
|
|
206
|
+
into a context string suitable for LLM input.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
project_id: Project ID to load context for
|
|
210
|
+
max_tokens: Maximum tokens for context
|
|
211
|
+
limit_conversations: Maximum conversations to consider
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Compressed context string
|
|
215
|
+
|
|
216
|
+
Example:
|
|
217
|
+
>>> context = await memory.load_context_for_session("proj-xyz")
|
|
218
|
+
>>> print(f"Loaded context: {len(context)} chars")
|
|
219
|
+
"""
|
|
220
|
+
# Get recent conversations from project
|
|
221
|
+
conversations = await self.store.list_by_project(
|
|
222
|
+
project_id, limit=limit_conversations
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
if not conversations:
|
|
226
|
+
logger.info("No conversations found for project %s", project_id)
|
|
227
|
+
return ""
|
|
228
|
+
|
|
229
|
+
# Compress into context
|
|
230
|
+
context = await self.compressor.compress_for_context(
|
|
231
|
+
conversations, max_tokens=max_tokens
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
logger.info(
|
|
235
|
+
"Loaded context for project %s: %d conversations, %d chars",
|
|
236
|
+
project_id,
|
|
237
|
+
len(conversations),
|
|
238
|
+
len(context),
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
return context
|
|
242
|
+
|
|
243
|
+
async def update_conversation(
|
|
244
|
+
self,
|
|
245
|
+
conversation_id: str,
|
|
246
|
+
new_messages: List[ThreadMessage],
|
|
247
|
+
) -> Optional[Conversation]:
|
|
248
|
+
"""Update existing conversation with new messages.
|
|
249
|
+
|
|
250
|
+
Args:
|
|
251
|
+
conversation_id: Conversation to update
|
|
252
|
+
new_messages: New messages to append
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
Updated conversation if found, None otherwise
|
|
256
|
+
|
|
257
|
+
Example:
|
|
258
|
+
>>> updated = await memory.update_conversation(
|
|
259
|
+
... "conv-abc123",
|
|
260
|
+
... [new_message1, new_message2]
|
|
261
|
+
... )
|
|
262
|
+
"""
|
|
263
|
+
# Load existing conversation
|
|
264
|
+
conversation = await self.store.load(conversation_id)
|
|
265
|
+
if not conversation:
|
|
266
|
+
logger.warning("Conversation %s not found", conversation_id)
|
|
267
|
+
return None
|
|
268
|
+
|
|
269
|
+
# Convert and append new messages
|
|
270
|
+
for thread_msg in new_messages:
|
|
271
|
+
conv_msg = ConversationMessage.from_thread_message(thread_msg)
|
|
272
|
+
|
|
273
|
+
# Extract entities
|
|
274
|
+
entities = self.extractor.extract(conv_msg.content)
|
|
275
|
+
conv_msg.entities = [e.to_dict() for e in entities]
|
|
276
|
+
|
|
277
|
+
conversation.messages.append(conv_msg)
|
|
278
|
+
|
|
279
|
+
# Update timestamp
|
|
280
|
+
conversation.updated_at = datetime.now(timezone.utc)
|
|
281
|
+
|
|
282
|
+
# Regenerate summary if needed
|
|
283
|
+
updated_summary = await self.compressor.update_summary_if_stale(
|
|
284
|
+
conversation, message_threshold=5
|
|
285
|
+
)
|
|
286
|
+
if updated_summary:
|
|
287
|
+
conversation.summary = updated_summary
|
|
288
|
+
|
|
289
|
+
# Regenerate embedding
|
|
290
|
+
text_for_embedding = conversation.summary or conversation.get_full_text()[:1000]
|
|
291
|
+
conversation.embedding = await self.embeddings.embed(text_for_embedding)
|
|
292
|
+
|
|
293
|
+
# Save
|
|
294
|
+
await self.store.save(conversation)
|
|
295
|
+
|
|
296
|
+
logger.info(
|
|
297
|
+
"Updated conversation %s (now %d messages)",
|
|
298
|
+
conversation_id,
|
|
299
|
+
len(conversation.messages),
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
return conversation
|
|
303
|
+
|
|
304
|
+
async def get_conversation_by_session(
|
|
305
|
+
self, session_id: str
|
|
306
|
+
) -> Optional[Conversation]:
|
|
307
|
+
"""Get conversation by session ID.
|
|
308
|
+
|
|
309
|
+
Args:
|
|
310
|
+
session_id: Session ID from ToolSession
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
Conversation if found, None otherwise
|
|
314
|
+
|
|
315
|
+
Example:
|
|
316
|
+
>>> conv = await memory.get_conversation_by_session("sess-abc123")
|
|
317
|
+
"""
|
|
318
|
+
# For now, this requires loading and checking
|
|
319
|
+
# In production, you'd add an index on session_id
|
|
320
|
+
# This is a placeholder - implement proper query in store
|
|
321
|
+
logger.warning(
|
|
322
|
+
"get_conversation_by_session requires optimization - "
|
|
323
|
+
"add session_id index to store"
|
|
324
|
+
)
|
|
325
|
+
return None
|