claude-mpm 5.0.9__py3-none-any.whl → 5.6.23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +4 -0
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +115 -0
- claude_mpm/agents/CLAUDE_MPM_RESEARCH_OUTPUT_STYLE.md +413 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
- claude_mpm/agents/MEMORY.md +1 -1
- claude_mpm/agents/PM_INSTRUCTIONS.md +479 -616
- claude_mpm/agents/WORKFLOW.md +6 -253
- claude_mpm/agents/agent_loader.py +13 -44
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/frontmatter_validator.py +70 -2
- claude_mpm/agents/templates/circuit-breakers.md +457 -62
- claude_mpm/cli/__init__.py +5 -2
- claude_mpm/cli/__main__.py +4 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/agent_state_manager.py +18 -27
- claude_mpm/cli/commands/agents.py +177 -41
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/auto_configure.py +723 -236
- claude_mpm/cli/commands/autotodos.py +566 -0
- claude_mpm/cli/commands/commander.py +216 -0
- claude_mpm/cli/commands/config.py +88 -2
- claude_mpm/cli/commands/configure.py +1874 -170
- claude_mpm/cli/commands/configure_agent_display.py +27 -6
- claude_mpm/cli/commands/hook_errors.py +60 -60
- claude_mpm/cli/commands/monitor.py +2 -2
- claude_mpm/cli/commands/mpm_init/core.py +232 -46
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
- claude_mpm/cli/commands/postmortem.py +1 -1
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +35 -3
- claude_mpm/cli/commands/skill_source.py +51 -2
- claude_mpm/cli/commands/skills.py +379 -204
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +141 -19
- claude_mpm/cli/interactive/__init__.py +10 -0
- claude_mpm/cli/interactive/agent_wizard.py +115 -60
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/parsers/agents_parser.py +54 -9
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -138
- claude_mpm/cli/parsers/base_parser.py +88 -1
- claude_mpm/cli/parsers/commander_parser.py +116 -0
- claude_mpm/cli/parsers/config_parser.py +153 -83
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +10 -0
- claude_mpm/cli/parsers/skill_source_parser.py +4 -0
- claude_mpm/cli/parsers/skills_parser.py +1 -1
- claude_mpm/cli/startup.py +1017 -266
- claude_mpm/cli/startup_display.py +74 -6
- claude_mpm/cli/startup_logging.py +2 -2
- claude_mpm/cli/utils.py +7 -3
- claude_mpm/commander/__init__.py +78 -0
- claude_mpm/commander/adapters/__init__.py +60 -0
- claude_mpm/commander/adapters/auggie.py +260 -0
- claude_mpm/commander/adapters/base.py +288 -0
- claude_mpm/commander/adapters/claude_code.py +392 -0
- claude_mpm/commander/adapters/codex.py +237 -0
- claude_mpm/commander/adapters/communication.py +366 -0
- claude_mpm/commander/adapters/example_usage.py +310 -0
- claude_mpm/commander/adapters/mpm.py +389 -0
- claude_mpm/commander/adapters/registry.py +204 -0
- claude_mpm/commander/api/__init__.py +16 -0
- claude_mpm/commander/api/app.py +121 -0
- claude_mpm/commander/api/errors.py +133 -0
- claude_mpm/commander/api/routes/__init__.py +8 -0
- claude_mpm/commander/api/routes/events.py +184 -0
- claude_mpm/commander/api/routes/inbox.py +171 -0
- claude_mpm/commander/api/routes/messages.py +148 -0
- claude_mpm/commander/api/routes/projects.py +271 -0
- claude_mpm/commander/api/routes/sessions.py +226 -0
- claude_mpm/commander/api/routes/work.py +296 -0
- claude_mpm/commander/api/schemas.py +186 -0
- claude_mpm/commander/chat/__init__.py +7 -0
- claude_mpm/commander/chat/cli.py +146 -0
- claude_mpm/commander/chat/commands.py +96 -0
- claude_mpm/commander/chat/repl.py +310 -0
- claude_mpm/commander/config.py +51 -0
- claude_mpm/commander/config_loader.py +115 -0
- claude_mpm/commander/core/__init__.py +10 -0
- claude_mpm/commander/core/block_manager.py +325 -0
- claude_mpm/commander/core/response_manager.py +323 -0
- claude_mpm/commander/daemon.py +603 -0
- claude_mpm/commander/env_loader.py +59 -0
- claude_mpm/commander/events/__init__.py +26 -0
- claude_mpm/commander/events/manager.py +332 -0
- claude_mpm/commander/frameworks/__init__.py +12 -0
- claude_mpm/commander/frameworks/base.py +146 -0
- claude_mpm/commander/frameworks/claude_code.py +58 -0
- claude_mpm/commander/frameworks/mpm.py +62 -0
- claude_mpm/commander/inbox/__init__.py +16 -0
- claude_mpm/commander/inbox/dedup.py +128 -0
- claude_mpm/commander/inbox/inbox.py +224 -0
- claude_mpm/commander/inbox/models.py +70 -0
- claude_mpm/commander/instance_manager.py +450 -0
- claude_mpm/commander/llm/__init__.py +6 -0
- claude_mpm/commander/llm/openrouter_client.py +167 -0
- claude_mpm/commander/llm/summarizer.py +70 -0
- claude_mpm/commander/memory/__init__.py +45 -0
- claude_mpm/commander/memory/compression.py +347 -0
- claude_mpm/commander/memory/embeddings.py +230 -0
- claude_mpm/commander/memory/entities.py +310 -0
- claude_mpm/commander/memory/example_usage.py +290 -0
- claude_mpm/commander/memory/integration.py +325 -0
- claude_mpm/commander/memory/search.py +381 -0
- claude_mpm/commander/memory/store.py +657 -0
- claude_mpm/commander/models/__init__.py +18 -0
- claude_mpm/commander/models/events.py +121 -0
- claude_mpm/commander/models/project.py +162 -0
- claude_mpm/commander/models/work.py +214 -0
- claude_mpm/commander/parsing/__init__.py +20 -0
- claude_mpm/commander/parsing/extractor.py +132 -0
- claude_mpm/commander/parsing/output_parser.py +270 -0
- claude_mpm/commander/parsing/patterns.py +100 -0
- claude_mpm/commander/persistence/__init__.py +11 -0
- claude_mpm/commander/persistence/event_store.py +274 -0
- claude_mpm/commander/persistence/state_store.py +309 -0
- claude_mpm/commander/persistence/work_store.py +164 -0
- claude_mpm/commander/polling/__init__.py +13 -0
- claude_mpm/commander/polling/event_detector.py +104 -0
- claude_mpm/commander/polling/output_buffer.py +49 -0
- claude_mpm/commander/polling/output_poller.py +153 -0
- claude_mpm/commander/project_session.py +268 -0
- claude_mpm/commander/proxy/__init__.py +12 -0
- claude_mpm/commander/proxy/formatter.py +89 -0
- claude_mpm/commander/proxy/output_handler.py +191 -0
- claude_mpm/commander/proxy/relay.py +155 -0
- claude_mpm/commander/registry.py +410 -0
- claude_mpm/commander/runtime/__init__.py +10 -0
- claude_mpm/commander/runtime/executor.py +191 -0
- claude_mpm/commander/runtime/monitor.py +346 -0
- claude_mpm/commander/session/__init__.py +6 -0
- claude_mpm/commander/session/context.py +81 -0
- claude_mpm/commander/session/manager.py +59 -0
- claude_mpm/commander/tmux_orchestrator.py +361 -0
- claude_mpm/commander/web/__init__.py +1 -0
- claude_mpm/commander/work/__init__.py +30 -0
- claude_mpm/commander/work/executor.py +207 -0
- claude_mpm/commander/work/queue.py +405 -0
- claude_mpm/commander/workflow/__init__.py +27 -0
- claude_mpm/commander/workflow/event_handler.py +241 -0
- claude_mpm/commander/workflow/notifier.py +146 -0
- claude_mpm/commands/mpm-config.md +36 -0
- claude_mpm/commands/mpm-doctor.md +16 -21
- claude_mpm/commands/mpm-help.md +12 -286
- claude_mpm/commands/mpm-init.md +88 -506
- claude_mpm/commands/mpm-monitor.md +22 -401
- claude_mpm/commands/mpm-organize.md +128 -0
- claude_mpm/commands/mpm-postmortem.md +13 -107
- claude_mpm/commands/mpm-session-resume.md +20 -363
- claude_mpm/commands/mpm-status.md +13 -69
- claude_mpm/commands/mpm-ticket-view.md +60 -495
- claude_mpm/commands/mpm-version.md +13 -107
- claude_mpm/commands/mpm.md +8 -0
- claude_mpm/config/agent_presets.py +8 -7
- claude_mpm/config/agent_sources.py +27 -0
- claude_mpm/config/skill_sources.py +16 -0
- claude_mpm/constants.py +1 -0
- claude_mpm/core/claude_runner.py +154 -2
- claude_mpm/core/config.py +37 -26
- claude_mpm/core/config_constants.py +74 -9
- claude_mpm/core/constants.py +56 -12
- claude_mpm/core/framework/formatters/content_formatter.py +3 -13
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/instruction_loader.py +52 -11
- claude_mpm/core/framework_loader.py +4 -2
- claude_mpm/core/hook_manager.py +51 -3
- claude_mpm/core/interactive_session.py +12 -11
- claude_mpm/core/logger.py +39 -9
- claude_mpm/core/logging_utils.py +35 -11
- claude_mpm/core/network_config.py +148 -0
- claude_mpm/core/oneshot_session.py +7 -6
- claude_mpm/core/optimized_startup.py +61 -0
- claude_mpm/core/output_style_manager.py +219 -44
- claude_mpm/core/shared/config_loader.py +3 -1
- claude_mpm/core/socketio_pool.py +16 -8
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +76 -8
- claude_mpm/core/unified_paths.py +95 -90
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.C33zOoyM.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.CW1J-YuA.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/1WZnGYqX.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/67pF3qNn.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/6RxdMKe4.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/8cZrfX0h.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/9a6T2nm-.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B443AUzu.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B8AwtY2H.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BF15LAsF.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BRcwIQNr.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BV6nKitt.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BViJ8lZt.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BcQ-Q0FE.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bpyvgze_.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BzTRqg-z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C0Fr8dve.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C3rbW_a-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C8WYN38h.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C9I8FlXH.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIQcWgO2.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CIctN7YN.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CKrS_JZW.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CR6P9C4A.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRRR9MD_.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CRcR2DqT.js +334 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CSXtMOf0.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CT-sbxSk.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CWm6DJsp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CpqQ1Kzn.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D2nGpDRe.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9iCMida.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9ykgMoY.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DL2Ldur1.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DPfltzjH.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DR8nis88.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUliQN2b.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DXlhR01x.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D_lyTybS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DngoTTgh.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DqkmHtDC.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DsDh8EYs.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DypDmXgd.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/IPYC-LnN.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JTLiF7dt.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/JpevfAFt.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/R8CEIRAd.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Zxy7qc-l.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/q9Hm6zAU.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/qtd3IeO4.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ulBFON_C.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/wQVh1CoA.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.Dr7t0z2J.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.BGhZHUS3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.RgBboRvH.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.DG-KkbDf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.D_jnf-x6.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- claude_mpm/experimental/cli_enhancements.py +2 -1
- claude_mpm/hooks/claude_hooks/INTEGRATION_EXAMPLE.md +243 -0
- claude_mpm/hooks/claude_hooks/README_AUTO_PAUSE.md +403 -0
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/auto_pause_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/auto_pause_handler.py +485 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +479 -128
- claude_mpm/hooks/claude_hooks/hook_handler.py +254 -83
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +6 -11
- claude_mpm/hooks/claude_hooks/installer.py +149 -18
- claude_mpm/hooks/claude_hooks/memory_integration.py +67 -19
- claude_mpm/hooks/claude_hooks/response_tracking.py +44 -62
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +69 -30
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +36 -103
- claude_mpm/hooks/claude_hooks/services/state_manager.py +23 -36
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +73 -75
- claude_mpm/hooks/kuzu_memory_hook.py +5 -5
- claude_mpm/hooks/memory_integration_hook.py +46 -1
- claude_mpm/hooks/session_resume_hook.py +89 -1
- claude_mpm/hooks/templates/pre_tool_use_template.py +10 -2
- claude_mpm/init.py +276 -19
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/models/git_repository.py +3 -3
- claude_mpm/scripts/claude-hook-handler.sh +87 -20
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/scripts/start_activity_logging.py +0 -0
- claude_mpm/services/agents/agent_builder.py +3 -3
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -0
- claude_mpm/services/agents/agent_selection_service.py +2 -2
- claude_mpm/services/agents/cache_git_manager.py +7 -7
- claude_mpm/services/agents/deployment/agent_deployment.py +29 -7
- claude_mpm/services/agents/deployment/agent_discovery_service.py +6 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +25 -13
- claude_mpm/services/agents/deployment/agent_template_builder.py +42 -20
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +2 -2
- claude_mpm/services/agents/deployment/async_agent_deployment.py +31 -27
- claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/local_template_deployment.py +3 -1
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +348 -29
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +570 -68
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/git_source_manager.py +57 -4
- claude_mpm/services/agents/loading/base_agent_manager.py +1 -13
- claude_mpm/services/agents/loading/framework_agent_loader.py +75 -2
- claude_mpm/services/agents/recommender.py +5 -3
- claude_mpm/services/agents/single_tier_deployment_service.py +6 -6
- claude_mpm/services/agents/sources/git_source_sync_service.py +129 -11
- claude_mpm/services/agents/startup_sync.py +27 -4
- claude_mpm/services/agents/toolchain_detector.py +10 -6
- claude_mpm/services/analysis/__init__.py +11 -1
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/cli/__init__.py +3 -0
- claude_mpm/services/cli/incremental_pause_manager.py +561 -0
- claude_mpm/services/cli/session_resume_helper.py +10 -2
- claude_mpm/services/command_deployment_service.py +81 -10
- claude_mpm/services/delegation_detector.py +175 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +2 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +31 -1
- claude_mpm/services/diagnostics/checks/configuration_check.py +24 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +22 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +23 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +31 -1
- claude_mpm/services/diagnostics/models.py +14 -1
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/event_log.py +325 -0
- claude_mpm/services/git/git_operations_service.py +101 -16
- claude_mpm/services/infrastructure/__init__.py +4 -0
- claude_mpm/services/infrastructure/context_usage_tracker.py +291 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +24 -5
- claude_mpm/services/monitor/daemon.py +9 -2
- claude_mpm/services/monitor/daemon_manager.py +54 -7
- claude_mpm/services/monitor/management/lifecycle.py +15 -3
- claude_mpm/services/monitor/server.py +796 -30
- claude_mpm/services/pm_skills_deployer.py +884 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/self_upgrade_service.py +120 -12
- claude_mpm/services/skills/__init__.py +3 -0
- claude_mpm/services/skills/git_skill_source_manager.py +303 -12
- claude_mpm/services/skills/selective_skill_deployer.py +869 -0
- claude_mpm/services/skills/skill_discovery_service.py +74 -4
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_deployer.py +294 -55
- claude_mpm/services/socketio/dashboard_server.py +1 -0
- claude_mpm/services/socketio/event_normalizer.py +51 -6
- claude_mpm/services/socketio/handlers/hook.py +14 -7
- claude_mpm/services/socketio/server/core.py +386 -108
- claude_mpm/services/socketio/server/main.py +12 -4
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/skills/__init__.py +2 -1
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/pm/mpm/SKILL.md +38 -0
- claude_mpm/skills/bundled/pm/mpm-agent-update-workflow/SKILL.md +75 -0
- claude_mpm/skills/bundled/pm/mpm-bug-reporting/SKILL.md +248 -0
- claude_mpm/skills/bundled/pm/mpm-circuit-breaker-enforcement/SKILL.md +476 -0
- claude_mpm/skills/bundled/pm/mpm-config/SKILL.md +29 -0
- claude_mpm/skills/bundled/pm/mpm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/mpm-doctor/SKILL.md +53 -0
- claude_mpm/skills/bundled/pm/mpm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/mpm-help/SKILL.md +35 -0
- claude_mpm/skills/bundled/pm/mpm-init/SKILL.md +125 -0
- claude_mpm/skills/bundled/pm/mpm-monitor/SKILL.md +32 -0
- claude_mpm/skills/bundled/pm/mpm-organize/SKILL.md +121 -0
- claude_mpm/skills/bundled/pm/mpm-postmortem/SKILL.md +22 -0
- claude_mpm/skills/bundled/pm/mpm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/mpm-session-management/SKILL.md +312 -0
- claude_mpm/skills/bundled/pm/mpm-session-pause/SKILL.md +170 -0
- claude_mpm/skills/bundled/pm/mpm-session-resume/SKILL.md +31 -0
- claude_mpm/skills/bundled/pm/mpm-status/SKILL.md +37 -0
- claude_mpm/skills/bundled/pm/mpm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/mpm-ticket-view/SKILL.md +110 -0
- claude_mpm/skills/bundled/pm/mpm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/mpm-tool-usage-guide/SKILL.md +386 -0
- claude_mpm/skills/bundled/pm/mpm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/pm/mpm-version/SKILL.md +21 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +112 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/registry.py +295 -90
- claude_mpm/skills/skill_manager.py +98 -3
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/utils/agent_dependency_loader.py +115 -4
- claude_mpm/utils/agent_filters.py +17 -44
- claude_mpm/utils/gitignore.py +3 -0
- claude_mpm/utils/migration.py +4 -4
- claude_mpm/utils/robust_installer.py +86 -21
- claude_mpm-5.6.23.dist-info/METADATA +393 -0
- {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/RECORD +508 -261
- claude_mpm-5.6.23.dist-info/entry_points.txt +5 -0
- claude_mpm-5.6.23.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.6.23.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -292
- claude_mpm/agents/BASE_DOCUMENTATION.md +0 -53
- claude_mpm/agents/BASE_OPS.md +0 -219
- claude_mpm/agents/BASE_PM.md +0 -480
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +0 -787
- claude_mpm/agents/BASE_QA.md +0 -167
- claude_mpm/agents/BASE_RESEARCH.md +0 -53
- claude_mpm/agents/OUTPUT_STYLE.md +0 -290
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +0 -1322
- claude_mpm/agents/base_agent_loader.py +0 -601
- claude_mpm/cli/commands/agents_detect.py +0 -380
- claude_mpm/cli/commands/agents_recommend.py +0 -309
- claude_mpm/cli/ticket_cli.py +0 -35
- claude_mpm/commands/mpm-agents-auto-configure.md +0 -278
- claude_mpm/commands/mpm-agents-detect.md +0 -177
- claude_mpm/commands/mpm-agents-list.md +0 -131
- claude_mpm/commands/mpm-agents-recommend.md +0 -223
- claude_mpm/commands/mpm-config-view.md +0 -150
- claude_mpm/commands/mpm-ticket-organize.md +0 -304
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1914
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/socket-client.js +0 -1474
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -977
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- claude_mpm-5.0.9.dist-info/METADATA +0 -1028
- claude_mpm-5.0.9.dist-info/entry_points.txt +0 -10
- claude_mpm-5.0.9.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/WHEEL +0 -0
- {claude_mpm-5.0.9.dist-info → claude_mpm-5.6.23.dist-info}/top_level.txt +0 -0
|
File without changes
|
|
@@ -206,8 +206,8 @@ class AgentBuilderService:
|
|
|
206
206
|
"""
|
|
207
207
|
errors = []
|
|
208
208
|
|
|
209
|
-
# Required fields
|
|
210
|
-
required_fields = ["id", "name", "prompt"
|
|
209
|
+
# Required fields (model is optional - defaults to sonnet if not specified)
|
|
210
|
+
required_fields = ["id", "name", "prompt"]
|
|
211
211
|
for field in required_fields:
|
|
212
212
|
if field not in config:
|
|
213
213
|
errors.append(f"Missing required field: {field}")
|
|
@@ -219,7 +219,7 @@ class AgentBuilderService:
|
|
|
219
219
|
except AgentDeploymentError as e:
|
|
220
220
|
errors.append(str(e))
|
|
221
221
|
|
|
222
|
-
# Validate model
|
|
222
|
+
# Validate model (only if present)
|
|
223
223
|
if "model" in config:
|
|
224
224
|
try:
|
|
225
225
|
self._validate_model(config["model"])
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"""Agent Recommendation Service
|
|
2
|
+
|
|
3
|
+
WHY: Provides intelligent agent recommendations based on toolchain detection
|
|
4
|
+
and always-recommended core agents. Helps users discover and install the
|
|
5
|
+
most relevant agents for their project without manual selection.
|
|
6
|
+
|
|
7
|
+
DESIGN DECISION: Uses toolchain analysis to map detected languages/frameworks
|
|
8
|
+
to specific engineer agents, plus always includes core agents.
|
|
9
|
+
|
|
10
|
+
Architecture:
|
|
11
|
+
- Toolchain-based recommendations: Python → python-engineer, etc.
|
|
12
|
+
- Core agents (always recommended): engineer, qa-agent, memory-manager-agent, local-ops-agent,
|
|
13
|
+
research-agent, documentation-agent, security-agent
|
|
14
|
+
- Confidence-based filtering: Only recommend high-confidence detections
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Dict, List, Optional, Set
|
|
19
|
+
|
|
20
|
+
from ...services.project.toolchain_analyzer import ToolchainAnalyzerService
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class AgentRecommendationService:
|
|
24
|
+
"""Service for recommending agents based on project toolchain.
|
|
25
|
+
|
|
26
|
+
WHY: Users shouldn't have to manually figure out which agents to install.
|
|
27
|
+
This service provides intelligent recommendations based on detected stack.
|
|
28
|
+
|
|
29
|
+
DESIGN DECISION: Separated from configure.py for reusability and testability.
|
|
30
|
+
Can be used by CLI, API, or future auto-configuration features.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
# Core agents always included - Standard 6 core agents for essential PM workflow
|
|
34
|
+
# These agents are auto-deployed when no configuration exists
|
|
35
|
+
# Uses exact agent IDs from repository for consistency
|
|
36
|
+
CORE_AGENTS = {
|
|
37
|
+
"engineer", # General-purpose implementation
|
|
38
|
+
"research", # Codebase exploration and analysis
|
|
39
|
+
"qa", # Testing and quality assurance
|
|
40
|
+
"documentation", # Documentation generation
|
|
41
|
+
"ops", # Basic deployment operations
|
|
42
|
+
"ticketing", # Ticket tracking (essential for PM workflow)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
# Map detected languages to recommended engineer agents
|
|
46
|
+
LANGUAGE_TO_AGENTS: Dict[str, List[str]] = {
|
|
47
|
+
"python": [
|
|
48
|
+
"engineer/backend/python-engineer",
|
|
49
|
+
"qa/api-qa",
|
|
50
|
+
],
|
|
51
|
+
"javascript": [
|
|
52
|
+
"engineer/backend/javascript-engineer",
|
|
53
|
+
"engineer/data/typescript-engineer",
|
|
54
|
+
],
|
|
55
|
+
"typescript": [
|
|
56
|
+
"engineer/data/typescript-engineer",
|
|
57
|
+
"engineer/backend/javascript-engineer",
|
|
58
|
+
],
|
|
59
|
+
"rust": [
|
|
60
|
+
"engineer/backend/rust-engineer",
|
|
61
|
+
],
|
|
62
|
+
"go": [
|
|
63
|
+
"engineer/backend/golang-engineer",
|
|
64
|
+
],
|
|
65
|
+
"java": [
|
|
66
|
+
"engineer/backend/java-engineer",
|
|
67
|
+
],
|
|
68
|
+
"dart": [
|
|
69
|
+
"engineer/mobile/dart-engineer",
|
|
70
|
+
],
|
|
71
|
+
"php": [
|
|
72
|
+
"engineer/backend/php-engineer",
|
|
73
|
+
],
|
|
74
|
+
"ruby": [
|
|
75
|
+
"engineer/backend/ruby-engineer",
|
|
76
|
+
],
|
|
77
|
+
"swift": [
|
|
78
|
+
"engineer/mobile/swift-engineer",
|
|
79
|
+
],
|
|
80
|
+
"kotlin": [
|
|
81
|
+
"engineer/mobile/kotlin-engineer",
|
|
82
|
+
],
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
# Map detected frameworks to recommended agents
|
|
86
|
+
FRAMEWORK_TO_AGENTS: Dict[str, List[str]] = {
|
|
87
|
+
# Frontend frameworks
|
|
88
|
+
"react": [
|
|
89
|
+
"engineer/frontend/react-engineer",
|
|
90
|
+
"qa/web-qa",
|
|
91
|
+
],
|
|
92
|
+
"nextjs": [
|
|
93
|
+
"engineer/frontend/nextjs-engineer",
|
|
94
|
+
"engineer/frontend/react-engineer",
|
|
95
|
+
"ops/platform/vercel-ops",
|
|
96
|
+
],
|
|
97
|
+
"vue": [
|
|
98
|
+
"engineer/frontend/vue-engineer",
|
|
99
|
+
],
|
|
100
|
+
"angular": [
|
|
101
|
+
"engineer/frontend/angular-engineer",
|
|
102
|
+
],
|
|
103
|
+
# Backend frameworks
|
|
104
|
+
"fastapi": [
|
|
105
|
+
"engineer/backend/python-engineer",
|
|
106
|
+
"qa/api-qa",
|
|
107
|
+
],
|
|
108
|
+
"django": [
|
|
109
|
+
"engineer/backend/python-engineer",
|
|
110
|
+
"qa/api-qa",
|
|
111
|
+
],
|
|
112
|
+
"flask": [
|
|
113
|
+
"engineer/backend/python-engineer",
|
|
114
|
+
"qa/api-qa",
|
|
115
|
+
],
|
|
116
|
+
"express": [
|
|
117
|
+
"engineer/backend/javascript-engineer",
|
|
118
|
+
"qa/api-qa",
|
|
119
|
+
],
|
|
120
|
+
"nest": [
|
|
121
|
+
"engineer/backend/javascript-engineer",
|
|
122
|
+
"qa/api-qa",
|
|
123
|
+
],
|
|
124
|
+
# Mobile frameworks
|
|
125
|
+
"flutter": [
|
|
126
|
+
"engineer/mobile/dart-engineer",
|
|
127
|
+
],
|
|
128
|
+
"react-native": [
|
|
129
|
+
"engineer/frontend/react-engineer",
|
|
130
|
+
"engineer/mobile/react-native-engineer",
|
|
131
|
+
],
|
|
132
|
+
# Desktop frameworks
|
|
133
|
+
"tauri": [
|
|
134
|
+
"engineer/mobile/tauri-engineer",
|
|
135
|
+
"engineer/backend/rust-engineer",
|
|
136
|
+
],
|
|
137
|
+
"electron": [
|
|
138
|
+
"engineer/backend/javascript-engineer",
|
|
139
|
+
],
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
def __init__(self, toolchain_analyzer: Optional[ToolchainAnalyzerService] = None):
|
|
143
|
+
"""Initialize agent recommendation service.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
toolchain_analyzer: Optional pre-initialized toolchain analyzer.
|
|
147
|
+
If None, creates a new instance.
|
|
148
|
+
"""
|
|
149
|
+
self.toolchain_analyzer = toolchain_analyzer or ToolchainAnalyzerService()
|
|
150
|
+
|
|
151
|
+
def get_recommended_agents(
|
|
152
|
+
self,
|
|
153
|
+
project_path: Optional[str] = None,
|
|
154
|
+
confidence_threshold: float = 0.5,
|
|
155
|
+
) -> Set[str]:
|
|
156
|
+
"""Get recommended agents for a project.
|
|
157
|
+
|
|
158
|
+
Args:
|
|
159
|
+
project_path: Path to project directory. Defaults to cwd.
|
|
160
|
+
confidence_threshold: Minimum confidence for recommendations (0.0-1.0).
|
|
161
|
+
Only include detected components above this threshold.
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
Set of recommended agent IDs (e.g., {"qa-agent", "research-agent", ...})
|
|
165
|
+
|
|
166
|
+
Example:
|
|
167
|
+
>>> service = AgentRecommendationService()
|
|
168
|
+
>>> recommended = service.get_recommended_agents()
|
|
169
|
+
>>> "qa-agent" in recommended
|
|
170
|
+
True
|
|
171
|
+
>>> # For Python project:
|
|
172
|
+
>>> "engineer/backend/python-engineer" in recommended
|
|
173
|
+
True
|
|
174
|
+
"""
|
|
175
|
+
# Start with core agents (always recommended)
|
|
176
|
+
recommended = self.CORE_AGENTS.copy()
|
|
177
|
+
|
|
178
|
+
# Analyze project toolchain
|
|
179
|
+
if project_path is None:
|
|
180
|
+
project_path = str(Path.cwd())
|
|
181
|
+
|
|
182
|
+
try:
|
|
183
|
+
# ToolchainAnalyzerService.analyze_toolchain takes Path, not str
|
|
184
|
+
analysis = self.toolchain_analyzer.analyze_toolchain(Path(project_path))
|
|
185
|
+
except Exception as e:
|
|
186
|
+
# If analysis fails, just return core agents
|
|
187
|
+
print(f"Warning: Toolchain analysis failed: {e}")
|
|
188
|
+
return recommended
|
|
189
|
+
|
|
190
|
+
# Add language-specific agents
|
|
191
|
+
# ToolchainAnalysis has a single LanguageDetection object, not a list
|
|
192
|
+
if analysis.language_detection:
|
|
193
|
+
# Check primary language
|
|
194
|
+
primary_lang = analysis.language_detection.primary_language.lower()
|
|
195
|
+
if primary_lang in self.LANGUAGE_TO_AGENTS:
|
|
196
|
+
recommended.update(self.LANGUAGE_TO_AGENTS[primary_lang])
|
|
197
|
+
|
|
198
|
+
# Check secondary languages
|
|
199
|
+
for lang_component in analysis.language_detection.secondary_languages:
|
|
200
|
+
lang = lang_component.name.lower()
|
|
201
|
+
if lang in self.LANGUAGE_TO_AGENTS:
|
|
202
|
+
recommended.update(self.LANGUAGE_TO_AGENTS[lang])
|
|
203
|
+
|
|
204
|
+
# Add framework-specific agents
|
|
205
|
+
for framework in analysis.frameworks:
|
|
206
|
+
fw_name = framework.name.lower()
|
|
207
|
+
if fw_name in self.FRAMEWORK_TO_AGENTS:
|
|
208
|
+
recommended.update(self.FRAMEWORK_TO_AGENTS[fw_name])
|
|
209
|
+
|
|
210
|
+
return recommended
|
|
211
|
+
|
|
212
|
+
def get_detection_summary(self, project_path: Optional[str] = None) -> Dict:
|
|
213
|
+
"""Get human-readable summary of detected toolchain.
|
|
214
|
+
|
|
215
|
+
Args:
|
|
216
|
+
project_path: Path to project directory. Defaults to cwd.
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
Dict with keys:
|
|
220
|
+
- detected_languages: List of detected language names
|
|
221
|
+
- detected_frameworks: List of detected framework names
|
|
222
|
+
- recommended_count: Number of recommended agents
|
|
223
|
+
- detection_quality: "high", "medium", "low", or "none"
|
|
224
|
+
|
|
225
|
+
Example:
|
|
226
|
+
>>> summary = service.get_detection_summary()
|
|
227
|
+
>>> summary['detected_languages']
|
|
228
|
+
['Python', 'JavaScript']
|
|
229
|
+
>>> summary['recommended_count']
|
|
230
|
+
15
|
|
231
|
+
"""
|
|
232
|
+
if project_path is None:
|
|
233
|
+
project_path = str(Path.cwd())
|
|
234
|
+
|
|
235
|
+
try:
|
|
236
|
+
analysis = self.toolchain_analyzer.analyze_toolchain(Path(project_path))
|
|
237
|
+
|
|
238
|
+
# Extract languages from LanguageDetection object
|
|
239
|
+
languages = []
|
|
240
|
+
if analysis.language_detection:
|
|
241
|
+
languages.append(analysis.language_detection.primary_language)
|
|
242
|
+
languages.extend(
|
|
243
|
+
comp.name
|
|
244
|
+
for comp in analysis.language_detection.secondary_languages
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
# Extract frameworks
|
|
248
|
+
frameworks = [fw.name for fw in analysis.frameworks]
|
|
249
|
+
|
|
250
|
+
# Get recommended agents
|
|
251
|
+
recommended = self.get_recommended_agents(project_path)
|
|
252
|
+
|
|
253
|
+
# Determine detection quality from overall_confidence
|
|
254
|
+
confidence_map = {
|
|
255
|
+
"high": "high",
|
|
256
|
+
"medium": "medium",
|
|
257
|
+
"low": "low",
|
|
258
|
+
"very_low": "low",
|
|
259
|
+
}
|
|
260
|
+
quality = confidence_map.get(
|
|
261
|
+
str(analysis.overall_confidence).lower(), "unknown"
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
return {
|
|
265
|
+
"detected_languages": languages,
|
|
266
|
+
"detected_frameworks": frameworks,
|
|
267
|
+
"recommended_count": len(recommended),
|
|
268
|
+
"detection_quality": quality,
|
|
269
|
+
}
|
|
270
|
+
except Exception as e:
|
|
271
|
+
# Log the error for debugging
|
|
272
|
+
print(f"Warning: Toolchain analysis failed: {e}")
|
|
273
|
+
return {
|
|
274
|
+
"detected_languages": [],
|
|
275
|
+
"detected_frameworks": [],
|
|
276
|
+
"recommended_count": len(self.CORE_AGENTS),
|
|
277
|
+
"detection_quality": "none",
|
|
278
|
+
}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"""Agent review service for comparing project agents with managed agents.
|
|
2
|
+
|
|
3
|
+
WHY: This service helps users maintain a clean agent directory by:
|
|
4
|
+
1. Identifying which agents are managed vs custom
|
|
5
|
+
2. Detecting outdated versions of managed agents
|
|
6
|
+
3. Finding unused agents that don't match the detected toolchain
|
|
7
|
+
4. Safely archiving unnecessary agents instead of deleting them
|
|
8
|
+
|
|
9
|
+
DESIGN DECISIONS:
|
|
10
|
+
- Archive to .claude/agents/unused/ instead of deleting (safe, recoverable)
|
|
11
|
+
- Add timestamps to archived files to prevent conflicts
|
|
12
|
+
- Preserve custom user agents (not in managed set)
|
|
13
|
+
- Compare versions to detect outdated managed agents
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import shutil
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import Any, Dict, List, Set
|
|
20
|
+
|
|
21
|
+
from claude_mpm.core.logging_config import get_logger
|
|
22
|
+
|
|
23
|
+
logger = get_logger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class AgentReviewService:
|
|
27
|
+
"""Service for reviewing and managing project agents.
|
|
28
|
+
|
|
29
|
+
This service analyzes the relationship between project agents and managed
|
|
30
|
+
agents from the claude-mpm-agents repository, categorizing them as:
|
|
31
|
+
- Managed: In sync with managed agents
|
|
32
|
+
- Outdated: Older version of managed agent exists
|
|
33
|
+
- Custom: User-created agents not in managed set
|
|
34
|
+
- Unused: Not recommended for this project's toolchain
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(self):
|
|
38
|
+
"""Initialize the agent review service."""
|
|
39
|
+
self.logger = get_logger(__name__)
|
|
40
|
+
|
|
41
|
+
def review_project_agents(
|
|
42
|
+
self,
|
|
43
|
+
project_agents_dir: Path,
|
|
44
|
+
managed_agents: List[Dict[str, Any]],
|
|
45
|
+
recommended_agent_ids: Set[str],
|
|
46
|
+
) -> Dict[str, List[Dict[str, Any]]]:
|
|
47
|
+
"""Review existing project agents and categorize them.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
project_agents_dir: Directory containing project agents (.claude/agents/)
|
|
51
|
+
managed_agents: List of managed agent dicts from cache
|
|
52
|
+
recommended_agent_ids: Set of agent IDs recommended for this toolchain
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
Dictionary with categorized agents:
|
|
56
|
+
{
|
|
57
|
+
"managed": [...], # In sync with managed
|
|
58
|
+
"outdated": [...], # Older version exists
|
|
59
|
+
"custom": [...], # User-created
|
|
60
|
+
"unused": [...], # Not needed for this toolchain
|
|
61
|
+
}
|
|
62
|
+
"""
|
|
63
|
+
results = {
|
|
64
|
+
"managed": [],
|
|
65
|
+
"outdated": [],
|
|
66
|
+
"custom": [],
|
|
67
|
+
"unused": [],
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if not project_agents_dir.exists():
|
|
71
|
+
self.logger.debug(
|
|
72
|
+
f"Project agents directory does not exist: {project_agents_dir}"
|
|
73
|
+
)
|
|
74
|
+
return results
|
|
75
|
+
|
|
76
|
+
# Build lookup map of managed agents by ID
|
|
77
|
+
managed_by_id = {agent["agent_id"]: agent for agent in managed_agents}
|
|
78
|
+
|
|
79
|
+
# Scan project agents
|
|
80
|
+
for agent_file in project_agents_dir.glob("*.md"):
|
|
81
|
+
# Skip the unused directory itself
|
|
82
|
+
if agent_file.name == "unused":
|
|
83
|
+
continue
|
|
84
|
+
|
|
85
|
+
agent_name = agent_file.stem
|
|
86
|
+
|
|
87
|
+
# Parse agent to get version and metadata
|
|
88
|
+
project_agent_info = self._parse_project_agent(agent_file)
|
|
89
|
+
|
|
90
|
+
# Check if this is a managed agent
|
|
91
|
+
if agent_name in managed_by_id:
|
|
92
|
+
managed_agent = managed_by_id[agent_name]
|
|
93
|
+
|
|
94
|
+
# Compare versions
|
|
95
|
+
project_version = project_agent_info.get("version", "unknown")
|
|
96
|
+
managed_version = managed_agent.get("version", "unknown")
|
|
97
|
+
|
|
98
|
+
if self._is_outdated(project_version, managed_version):
|
|
99
|
+
# Outdated version of managed agent
|
|
100
|
+
results["outdated"].append(
|
|
101
|
+
{
|
|
102
|
+
"name": agent_name,
|
|
103
|
+
"path": agent_file,
|
|
104
|
+
"current_version": project_version,
|
|
105
|
+
"available_version": managed_version,
|
|
106
|
+
"recommended": agent_name in recommended_agent_ids,
|
|
107
|
+
}
|
|
108
|
+
)
|
|
109
|
+
else:
|
|
110
|
+
# Up-to-date managed agent
|
|
111
|
+
results["managed"].append(
|
|
112
|
+
{
|
|
113
|
+
"name": agent_name,
|
|
114
|
+
"path": agent_file,
|
|
115
|
+
"version": project_version,
|
|
116
|
+
"recommended": agent_name in recommended_agent_ids,
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
else:
|
|
120
|
+
# Custom user agent (not in managed set)
|
|
121
|
+
results["custom"].append(
|
|
122
|
+
{
|
|
123
|
+
"name": agent_name,
|
|
124
|
+
"path": agent_file,
|
|
125
|
+
"version": project_agent_info.get("version", "unknown"),
|
|
126
|
+
}
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
# Identify unused agents (managed or outdated but not recommended)
|
|
130
|
+
for category in ["managed", "outdated"]:
|
|
131
|
+
for agent in results[category][:]: # Copy list to modify during iteration
|
|
132
|
+
if not agent.get("recommended", False):
|
|
133
|
+
# This managed/outdated agent is not recommended for this toolchain
|
|
134
|
+
results["unused"].append(agent)
|
|
135
|
+
results[category].remove(agent)
|
|
136
|
+
|
|
137
|
+
self.logger.info(
|
|
138
|
+
f"Agent review complete: "
|
|
139
|
+
f"{len(results['managed'])} managed, "
|
|
140
|
+
f"{len(results['outdated'])} outdated, "
|
|
141
|
+
f"{len(results['custom'])} custom, "
|
|
142
|
+
f"{len(results['unused'])} unused"
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
return results
|
|
146
|
+
|
|
147
|
+
def archive_agents(
|
|
148
|
+
self, agents_to_archive: List[Dict[str, Any]], project_agents_dir: Path
|
|
149
|
+
) -> Dict[str, Any]:
|
|
150
|
+
"""Archive agents by moving them to .claude/agents/unused/.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
agents_to_archive: List of agent dicts with 'name' and 'path' keys
|
|
154
|
+
project_agents_dir: Base agents directory (.claude/agents/)
|
|
155
|
+
|
|
156
|
+
Returns:
|
|
157
|
+
Dictionary with archival results:
|
|
158
|
+
{
|
|
159
|
+
"archived": [...], # Successfully archived
|
|
160
|
+
"errors": [...], # Archival errors
|
|
161
|
+
}
|
|
162
|
+
"""
|
|
163
|
+
results = {"archived": [], "errors": []}
|
|
164
|
+
|
|
165
|
+
if not agents_to_archive:
|
|
166
|
+
return results
|
|
167
|
+
|
|
168
|
+
# Create unused directory
|
|
169
|
+
unused_dir = project_agents_dir / "unused"
|
|
170
|
+
unused_dir.mkdir(exist_ok=True)
|
|
171
|
+
|
|
172
|
+
for agent in agents_to_archive:
|
|
173
|
+
agent_path = agent["path"]
|
|
174
|
+
agent_name = agent["name"]
|
|
175
|
+
|
|
176
|
+
try:
|
|
177
|
+
# Generate timestamped filename to avoid conflicts
|
|
178
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
179
|
+
archived_name = f"{agent_name}_{timestamp}.md"
|
|
180
|
+
archived_path = unused_dir / archived_name
|
|
181
|
+
|
|
182
|
+
# Move the file
|
|
183
|
+
shutil.move(str(agent_path), str(archived_path))
|
|
184
|
+
|
|
185
|
+
results["archived"].append(
|
|
186
|
+
{
|
|
187
|
+
"name": agent_name,
|
|
188
|
+
"original_path": str(agent_path),
|
|
189
|
+
"archived_path": str(archived_path),
|
|
190
|
+
}
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
self.logger.debug(f"Archived {agent_name} to {archived_path}")
|
|
194
|
+
|
|
195
|
+
except Exception as e:
|
|
196
|
+
error_msg = f"Failed to archive {agent_name}: {e}"
|
|
197
|
+
self.logger.error(error_msg)
|
|
198
|
+
results["errors"].append(error_msg)
|
|
199
|
+
|
|
200
|
+
self.logger.info(
|
|
201
|
+
f"Archived {len(results['archived'])} agents, "
|
|
202
|
+
f"{len(results['errors'])} errors"
|
|
203
|
+
)
|
|
204
|
+
|
|
205
|
+
return results
|
|
206
|
+
|
|
207
|
+
def _parse_project_agent(self, agent_file: Path) -> Dict[str, Any]:
|
|
208
|
+
"""Parse a project agent file to extract metadata.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
agent_file: Path to agent Markdown file
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Dictionary with agent metadata (version, name, etc.)
|
|
215
|
+
"""
|
|
216
|
+
try:
|
|
217
|
+
content = agent_file.read_text(encoding="utf-8")
|
|
218
|
+
|
|
219
|
+
# Extract version from YAML frontmatter
|
|
220
|
+
import re
|
|
221
|
+
|
|
222
|
+
version_match = re.search(
|
|
223
|
+
r'^version:\s*["\']?(.+?)["\']?$', content, re.MULTILINE
|
|
224
|
+
)
|
|
225
|
+
version = version_match.group(1) if version_match else "unknown"
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
"version": version,
|
|
229
|
+
"name": agent_file.stem,
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
except Exception as e:
|
|
233
|
+
self.logger.warning(f"Failed to parse agent {agent_file.name}: {e}")
|
|
234
|
+
return {"version": "unknown", "name": agent_file.stem}
|
|
235
|
+
|
|
236
|
+
def _is_outdated(self, current_version: str, available_version: str) -> bool:
|
|
237
|
+
"""Check if current version is outdated compared to available version.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
current_version: Currently deployed version
|
|
241
|
+
available_version: Available version from managed agents
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
True if current version is outdated
|
|
245
|
+
"""
|
|
246
|
+
# Handle unknown versions
|
|
247
|
+
if current_version == "unknown" or available_version == "unknown":
|
|
248
|
+
return False
|
|
249
|
+
|
|
250
|
+
# Simple string comparison for now
|
|
251
|
+
# TODO: Implement semantic version comparison (1.2.3 vs 1.2.4)
|
|
252
|
+
return current_version != available_version
|
|
253
|
+
|
|
254
|
+
def get_archive_summary(self, project_agents_dir: Path) -> Dict[str, Any]:
|
|
255
|
+
"""Get summary of archived agents.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
project_agents_dir: Base agents directory (.claude/agents/)
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
Dictionary with archive statistics
|
|
262
|
+
"""
|
|
263
|
+
unused_dir = project_agents_dir / "unused"
|
|
264
|
+
|
|
265
|
+
if not unused_dir.exists():
|
|
266
|
+
return {"count": 0, "agents": []}
|
|
267
|
+
|
|
268
|
+
archived_files = list(unused_dir.glob("*.md"))
|
|
269
|
+
|
|
270
|
+
return {
|
|
271
|
+
"count": len(archived_files),
|
|
272
|
+
"agents": [
|
|
273
|
+
{
|
|
274
|
+
"name": f.stem,
|
|
275
|
+
"path": str(f),
|
|
276
|
+
"size_bytes": f.stat().st_size,
|
|
277
|
+
}
|
|
278
|
+
for f in archived_files
|
|
279
|
+
],
|
|
280
|
+
}
|
|
@@ -39,10 +39,10 @@ import logging
|
|
|
39
39
|
from pathlib import Path
|
|
40
40
|
from typing import Any, Dict, List, Optional, Set, Tuple
|
|
41
41
|
|
|
42
|
-
from
|
|
42
|
+
from claude_mpm.services.agents.single_tier_deployment_service import (
|
|
43
43
|
SingleTierDeploymentService,
|
|
44
44
|
)
|
|
45
|
-
from
|
|
45
|
+
from claude_mpm.services.agents.toolchain_detector import ToolchainDetector
|
|
46
46
|
|
|
47
47
|
logger = logging.getLogger(__name__)
|
|
48
48
|
|
|
@@ -29,7 +29,7 @@ Error Handling:
|
|
|
29
29
|
|
|
30
30
|
Example:
|
|
31
31
|
>>> from pathlib import Path
|
|
32
|
-
>>> manager = CacheGitManager(Path.home() / ".claude-mpm/cache/
|
|
32
|
+
>>> manager = CacheGitManager(Path.home() / ".claude-mpm/cache/agents")
|
|
33
33
|
>>> if manager.is_git_repo():
|
|
34
34
|
... status = manager.get_status()
|
|
35
35
|
... print(f"Branch: {status['branch']}, Uncommitted: {len(status['uncommitted'])}")
|
|
@@ -76,7 +76,7 @@ class CacheGitManager:
|
|
|
76
76
|
timeout: Git command timeout in seconds (default: 30)
|
|
77
77
|
|
|
78
78
|
Example:
|
|
79
|
-
>>> cache_dir = Path.home() / ".claude-mpm/cache/
|
|
79
|
+
>>> cache_dir = Path.home() / ".claude-mpm/cache/agents"
|
|
80
80
|
>>> manager = CacheGitManager(cache_dir)
|
|
81
81
|
"""
|
|
82
82
|
self.cache_path = Path(cache_path)
|
|
@@ -88,7 +88,7 @@ class CacheGitManager:
|
|
|
88
88
|
if self.repo_path:
|
|
89
89
|
logger.debug(f"Initialized CacheGitManager for repo: {self.repo_path}")
|
|
90
90
|
else:
|
|
91
|
-
logger.
|
|
91
|
+
logger.debug(f"Cache path is not a git repository: {cache_path}")
|
|
92
92
|
|
|
93
93
|
def _find_git_root(self) -> Optional[Path]:
|
|
94
94
|
"""
|
|
@@ -105,12 +105,12 @@ class CacheGitManager:
|
|
|
105
105
|
|
|
106
106
|
Example:
|
|
107
107
|
>>> # Case 1: cache_path inside repo (searches upward)
|
|
108
|
-
>>> # cache_path: ~/.claude-mpm/cache/
|
|
109
|
-
>>> # Found at: ~/.claude-mpm/cache/
|
|
108
|
+
>>> # cache_path: ~/.claude-mpm/cache/agents/bobmatnyc/claude-mpm-agents/agents
|
|
109
|
+
>>> # Found at: ~/.claude-mpm/cache/agents/bobmatnyc/claude-mpm-agents
|
|
110
110
|
|
|
111
111
|
>>> # Case 2: repo nested in cache_path (searches downward)
|
|
112
|
-
>>> # cache_path: ~/.claude-mpm/cache/
|
|
113
|
-
>>> # Found at: ~/.claude-mpm/cache/
|
|
112
|
+
>>> # cache_path: ~/.claude-mpm/cache/agents
|
|
113
|
+
>>> # Found at: ~/.claude-mpm/cache/agents/bobmatnyc/claude-mpm-agents
|
|
114
114
|
"""
|
|
115
115
|
# Strategy 1: Search upward (cache_path is inside repo)
|
|
116
116
|
current = self.cache_path
|