claude-mpm 3.4.10__py3-none-any.whl → 5.4.85__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/BUILD_NUMBER +1 -0
- claude_mpm/VERSION +1 -0
- claude_mpm/__init__.py +50 -12
- claude_mpm/__main__.py +7 -2
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +112 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1429 -0
- claude_mpm/agents/WORKFLOW.md +111 -0
- claude_mpm/agents/__init__.py +92 -80
- claude_mpm/agents/agent-template.yaml +83 -0
- claude_mpm/agents/agent_loader.py +560 -745
- claude_mpm/agents/agent_loader_integration.py +53 -55
- claude_mpm/agents/agents_metadata.py +186 -27
- claude_mpm/agents/async_agent_loader.py +436 -0
- claude_mpm/agents/base_agent.json +8 -4
- claude_mpm/agents/frontmatter_validator.py +754 -0
- claude_mpm/agents/system_agent_config.py +222 -155
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/__init__.py +17 -13
- claude_mpm/agents/templates/circuit-breakers.md +1391 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +94 -128
- claude_mpm/cli/__main__.py +33 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +36 -12
- claude_mpm/cli/commands/agent_manager.py +1403 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +335 -0
- claude_mpm/cli/commands/agents.py +2501 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/aggregate.py +540 -0
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +1053 -0
- claude_mpm/cli/commands/cleanup.py +588 -0
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
- claude_mpm/cli/commands/config.py +586 -0
- claude_mpm/cli/commands/configure.py +3253 -0
- claude_mpm/cli/commands/configure_agent_display.py +282 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +243 -0
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +195 -74
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +205 -0
- claude_mpm/cli/commands/mcp_command_router.py +161 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +346 -0
- claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
- claude_mpm/cli/commands/mcp_server_commands.py +155 -0
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +585 -846
- claude_mpm/cli/commands/monitor.py +228 -310
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +759 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +195 -0
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +910 -488
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1398 -0
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/commands/tickets.py +536 -53
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +298 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +31 -0
- claude_mpm/cli/interactive/agent_wizard.py +1927 -0
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +87 -563
- claude_mpm/cli/parsers/__init__.py +35 -0
- claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +575 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
- claude_mpm/cli/parsers/base_parser.py +649 -0
- claude_mpm/cli/parsers/config_parser.py +208 -0
- claude_mpm/cli/parsers/configure_parser.py +138 -0
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +195 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +142 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +157 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +277 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/shared/__init__.py +40 -0
- claude_mpm/cli/shared/argument_patterns.py +205 -0
- claude_mpm/cli/shared/base_command.py +242 -0
- claude_mpm/cli/shared/error_handling.py +242 -0
- claude_mpm/cli/shared/output_formatters.py +241 -0
- claude_mpm/cli/startup.py +1578 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +839 -0
- claude_mpm/cli/utils.py +136 -47
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +42 -64
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-config.md +28 -0
- claude_mpm/commands/mpm-doctor.md +20 -0
- claude_mpm/commands/mpm-help.md +20 -0
- claude_mpm/commands/mpm-init.md +120 -0
- claude_mpm/commands/mpm-monitor.md +31 -0
- claude_mpm/commands/mpm-organize.md +120 -0
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +20 -0
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +20 -0
- claude_mpm/commands/mpm.md +31 -0
- claude_mpm/config/__init__.py +42 -2
- claude_mpm/config/agent_config.py +402 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +258 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +125 -83
- claude_mpm/constants.py +133 -22
- claude_mpm/core/__init__.py +62 -36
- claude_mpm/core/agent_name_normalizer.py +71 -73
- claude_mpm/core/agent_registry.py +385 -492
- claude_mpm/core/agent_session_manager.py +81 -70
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +159 -122
- claude_mpm/core/cache.py +560 -0
- claude_mpm/core/claude_runner.py +696 -916
- claude_mpm/core/config.py +613 -122
- claude_mpm/core/config_aliases.py +74 -73
- claude_mpm/core/config_constants.py +314 -0
- claude_mpm/core/constants.py +361 -0
- claude_mpm/core/container.py +646 -104
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/exceptions.py +536 -0
- claude_mpm/core/factories.py +105 -109
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +278 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +213 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +222 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +485 -414
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +246 -86
- claude_mpm/core/hook_performance_config.py +147 -0
- claude_mpm/core/injectable_service.py +72 -63
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +670 -0
- claude_mpm/core/interfaces.py +570 -164
- claude_mpm/core/lazy.py +467 -0
- claude_mpm/core/log_manager.py +707 -0
- claude_mpm/core/logger.py +295 -134
- claude_mpm/core/logging_config.py +474 -0
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/minimal_framework_loader.py +24 -22
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +594 -0
- claude_mpm/core/optimized_agent_loader.py +479 -0
- claude_mpm/core/optimized_startup.py +554 -0
- claude_mpm/core/output_style_manager.py +491 -0
- claude_mpm/core/pm_hook_interceptor.py +197 -82
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/service_registry.py +153 -116
- claude_mpm/core/session_manager.py +179 -64
- claude_mpm/core/shared/__init__.py +17 -0
- claude_mpm/core/shared/config_loader.py +326 -0
- claude_mpm/core/shared/path_resolver.py +281 -0
- claude_mpm/core/shared/singleton_manager.py +221 -0
- claude_mpm/core/socketio_pool.py +400 -137
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +64 -57
- claude_mpm/core/types.py +307 -0
- claude_mpm/core/typing_utils.py +553 -0
- claude_mpm/core/unified_agent_registry.py +969 -0
- claude_mpm/core/unified_config.py +612 -0
- claude_mpm/core/unified_paths.py +958 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.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/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.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/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +104 -89
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +76 -66
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +37 -32
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
- claude_mpm/hooks/claude_hooks/installer.py +806 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
- claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +201 -107
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +92 -76
- claude_mpm/hooks/validation_hooks.py +62 -54
- claude_mpm/init.py +518 -83
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +40 -23
- claude_mpm/models/agent_session.py +538 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/__init__.py +15 -0
- claude_mpm/scripts/claude-hook-handler.sh +227 -0
- claude_mpm/scripts/launch_monitor.py +165 -0
- claude_mpm/scripts/mpm_doctor.py +322 -0
- claude_mpm/scripts/socketio_daemon.py +189 -200
- claude_mpm/scripts/start_activity_logging.py +91 -0
- claude_mpm/services/__init__.py +208 -39
- claude_mpm/services/agent_capabilities_service.py +266 -0
- claude_mpm/services/agents/__init__.py +89 -0
- claude_mpm/services/agents/agent_builder.py +514 -0
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- 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 +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/__init__.py +21 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
- claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
- claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
- claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
- claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +1377 -0
- claude_mpm/services/agents/deployment/agent_validator.py +376 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
- claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
- claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
- claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
- claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
- claude_mpm/services/agents/git_source_manager.py +682 -0
- claude_mpm/services/agents/loading/__init__.py +11 -0
- claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
- claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
- claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/__init__.py +9 -0
- claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
- claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
- claude_mpm/services/agents/memory/__init__.py +22 -0
- claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
- claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
- claude_mpm/services/agents/memory/content_manager.py +470 -0
- claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
- claude_mpm/services/agents/memory/memory_file_service.py +129 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
- claude_mpm/services/agents/memory/template_generator.py +83 -0
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +617 -0
- claude_mpm/services/agents/registry/__init__.py +30 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
- claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1205 -0
- claude_mpm/services/agents/startup_sync.py +262 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/async_session_logger.py +665 -0
- claude_mpm/services/claude_session_logger.py +321 -0
- claude_mpm/services/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +408 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +590 -0
- claude_mpm/services/cli/memory_crud_service.py +622 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +604 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +362 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +446 -0
- claude_mpm/services/command_handler_service.py +221 -0
- claude_mpm/services/communication/__init__.py +22 -0
- claude_mpm/services/core/__init__.py +108 -0
- claude_mpm/services/core/base.py +269 -0
- claude_mpm/services/core/cache_manager.py +309 -0
- claude_mpm/services/core/interfaces/__init__.py +273 -0
- claude_mpm/services/core/interfaces/agent.py +514 -0
- claude_mpm/services/core/interfaces/communication.py +316 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/infrastructure.py +357 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/service.py +405 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +81 -0
- claude_mpm/services/core/memory_manager.py +682 -0
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +517 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- claude_mpm/services/diagnostics/__init__.py +18 -0
- claude_mpm/services/diagnostics/checks/__init__.py +38 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/base_check.py +60 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
- claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
- claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
- claude_mpm/services/diagnostics/models.py +138 -0
- claude_mpm/services/event_aggregator.py +582 -0
- claude_mpm/services/event_bus/__init__.py +18 -0
- claude_mpm/services/event_bus/config.py +186 -0
- claude_mpm/services/event_bus/direct_relay.py +312 -0
- claude_mpm/services/event_bus/event_bus.py +396 -0
- claude_mpm/services/event_bus/relay.py +326 -0
- claude_mpm/services/events/__init__.py +44 -0
- claude_mpm/services/events/consumers/__init__.py +18 -0
- claude_mpm/services/events/consumers/dead_letter.py +306 -0
- claude_mpm/services/events/consumers/logging.py +184 -0
- claude_mpm/services/events/consumers/metrics.py +241 -0
- claude_mpm/services/events/consumers/socketio.py +377 -0
- claude_mpm/services/events/core.py +480 -0
- claude_mpm/services/events/interfaces.py +214 -0
- claude_mpm/services/events/producers/__init__.py +14 -0
- claude_mpm/services/events/producers/hook.py +269 -0
- claude_mpm/services/events/producers/system.py +329 -0
- claude_mpm/services/exceptions.py +433 -353
- claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
- claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +159 -111
- claude_mpm/services/infrastructure/__init__.py +52 -0
- claude_mpm/services/infrastructure/context_preservation.py +569 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +209 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
- claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
- claude_mpm/services/infrastructure/monitoring/base.py +122 -0
- claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
- claude_mpm/services/infrastructure/monitoring/network.py +219 -0
- claude_mpm/services/infrastructure/monitoring/process.py +343 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
- claude_mpm/services/infrastructure/monitoring/service.py +368 -0
- claude_mpm/services/infrastructure/monitoring.py +71 -0
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/__init__.py +19 -0
- claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
- claude_mpm/services/memory/cache/__init__.py +14 -0
- claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
- claude_mpm/services/memory/cache/simple_cache.py +331 -0
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +648 -0
- claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
- claude_mpm/services/memory/router.py +951 -0
- claude_mpm/services/memory_hook_service.py +470 -0
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +698 -0
- claude_mpm/services/monitor/daemon_manager.py +1076 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +730 -0
- claude_mpm/services/monitor/server.py +1493 -0
- claude_mpm/services/monitor_build_service.py +349 -0
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/pm_skills_deployer.py +711 -0
- claude_mpm/services/port_manager.py +597 -0
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/__init__.py +44 -0
- claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
- claude_mpm/services/project/analyzer_v2.py +566 -0
- claude_mpm/services/project/architecture_analyzer.py +461 -0
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +462 -0
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +265 -0
- claude_mpm/services/project/metrics_collector.py +407 -0
- claude_mpm/services/project/project_organizer.py +1009 -0
- claude_mpm/services/project/registry.py +636 -0
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/recovery_manager.py +293 -240
- claude_mpm/services/response_tracker.py +267 -0
- claude_mpm/services/runner_configuration_service.py +605 -0
- claude_mpm/services/self_upgrade_service.py +608 -0
- claude_mpm/services/session_management_service.py +314 -0
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +21 -0
- claude_mpm/services/shared/async_service_base.py +216 -0
- claude_mpm/services/shared/config_service_base.py +301 -0
- claude_mpm/services/shared/lifecycle_service_base.py +308 -0
- claude_mpm/services/shared/manager_base.py +315 -0
- claude_mpm/services/shared/service_factory.py +309 -0
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1340 -0
- claude_mpm/services/skills/selective_skill_deployer.py +743 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1168 -0
- claude_mpm/services/socketio/__init__.py +25 -0
- claude_mpm/services/socketio/client_proxy.py +229 -0
- claude_mpm/services/socketio/dashboard_server.py +362 -0
- claude_mpm/services/socketio/event_normalizer.py +798 -0
- claude_mpm/services/socketio/handlers/__init__.py +30 -0
- claude_mpm/services/socketio/handlers/base.py +136 -0
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +643 -0
- claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
- claude_mpm/services/socketio/handlers/file.py +263 -0
- claude_mpm/services/socketio/handlers/git.py +962 -0
- claude_mpm/services/socketio/handlers/hook.py +211 -0
- claude_mpm/services/socketio/handlers/memory.py +26 -0
- claude_mpm/services/socketio/handlers/project.py +24 -0
- claude_mpm/services/socketio/handlers/registry.py +214 -0
- claude_mpm/services/socketio/migration_utils.py +343 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +569 -0
- claude_mpm/services/socketio/server/connection_manager.py +579 -0
- claude_mpm/services/socketio/server/core.py +1079 -0
- claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
- claude_mpm/services/socketio/server/main.py +501 -0
- claude_mpm/services/socketio_client_manager.py +173 -143
- claude_mpm/services/socketio_server.py +38 -1657
- claude_mpm/services/subprocess_launcher_service.py +322 -0
- claude_mpm/services/system_instructions_service.py +270 -0
- claude_mpm/services/ticket_manager.py +25 -209
- claude_mpm/services/ticket_services/__init__.py +26 -0
- claude_mpm/services/ticket_services/crud_service.py +328 -0
- claude_mpm/services/ticket_services/formatter_service.py +290 -0
- claude_mpm/services/ticket_services/search_service.py +324 -0
- claude_mpm/services/ticket_services/validation_service.py +303 -0
- claude_mpm/services/ticket_services/workflow_service.py +244 -0
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +280 -0
- claude_mpm/services/version_control/__init__.py +34 -37
- claude_mpm/services/version_control/branch_strategy.py +26 -17
- claude_mpm/services/version_control/conflict_resolution.py +52 -36
- claude_mpm/services/version_control/git_operations.py +183 -49
- claude_mpm/services/version_control/semantic_versioning.py +172 -61
- claude_mpm/services/version_control/version_parser.py +546 -0
- claude_mpm/services/version_service.py +379 -0
- claude_mpm/services/visualization/__init__.py +15 -0
- claude_mpm/services/visualization/mermaid_generator.py +937 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- 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/database-migration.md +199 -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/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -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/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -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/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -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/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -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/pm-bug-reporting/pm-bug-reporting.md +248 -0
- claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -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 +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -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/test-driven-development.md +378 -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/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -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/scripts/with_server.py +129 -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/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +405 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +546 -0
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/__init__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +1189 -0
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +168 -126
- claude_mpm/utils/console.py +11 -0
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +373 -0
- claude_mpm/utils/dependency_manager.py +60 -59
- claude_mpm/utils/dependency_strategies.py +381 -0
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +313 -0
- claude_mpm/utils/error_handler.py +78 -66
- claude_mpm/utils/file_utils.py +305 -0
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +110 -104
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +844 -0
- claude_mpm/utils/session_logging.py +121 -0
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +343 -0
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +214 -108
- claude_mpm/validation/frontmatter_validator.py +252 -0
- claude_mpm-5.4.85.dist-info/METADATA +1023 -0
- claude_mpm-5.4.85.dist-info/RECORD +980 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.85.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.85.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
- claude_mpm/agents/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/base_agent_loader.py +0 -529
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/data_engineer.json +0 -110
- claude_mpm/agents/templates/documentation.json +0 -109
- claude_mpm/agents/templates/engineer.json +0 -113
- claude_mpm/agents/templates/ops.json +0 -109
- claude_mpm/agents/templates/pm.json +0 -25
- claude_mpm/agents/templates/qa.json +0 -111
- claude_mpm/agents/templates/research.json +0 -65
- claude_mpm/agents/templates/security.json +0 -113
- claude_mpm/agents/templates/test_integration.json +0 -112
- claude_mpm/agents/templates/version_control.json +0 -107
- claude_mpm/cli/commands/ui.py +0 -57
- claude_mpm/core/simple_runner.py +0 -1046
- claude_mpm/dashboard/open_dashboard.py +0 -34
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/builtin/__init__.py +0 -1
- claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
- claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
- claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
- claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
- claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
- claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
- claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
- claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
- claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
- claude_mpm/orchestration/__init__.py +0 -6
- claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
- claude_mpm/orchestration/archive/factory.py +0 -215
- claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
- claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
- claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
- claude_mpm/orchestration/archive/orchestrator.py +0 -501
- claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
- claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
- claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
- claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
- claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
- claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
- claude_mpm/schemas/workflow_validator.py +0 -411
- claude_mpm/services/agent_deployment.py +0 -1534
- claude_mpm/services/agent_lifecycle_manager.py +0 -1169
- claude_mpm/services/agent_memory_manager.py +0 -1415
- claude_mpm/services/agent_registry.py +0 -676
- claude_mpm/services/deployed_agent_discovery.py +0 -226
- claude_mpm/services/framework_agent_loader.py +0 -337
- claude_mpm/services/framework_claude_md_generator.py +0 -621
- claude_mpm/services/health_monitor.py +0 -892
- claude_mpm/services/memory_router.py +0 -538
- claude_mpm/services/parent_directory_manager/__init__.py +0 -577
- claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
- claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
- claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
- claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
- claude_mpm/services/parent_directory_manager/operations.py +0 -186
- claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
- claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
- claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
- claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
- claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -508
- claude_mpm/ui/__init__.py +0 -1
- claude_mpm/ui/rich_terminal_ui.py +0 -295
- claude_mpm/ui/terminal_ui.py +0 -328
- claude_mpm/utils/paths.py +0 -289
- claude_mpm-3.4.10.dist-info/METADATA +0 -183
- claude_mpm-3.4.10.dist-info/RECORD +0 -201
- claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,1403 @@
|
|
|
1
|
+
"""Agent Manager CLI command for comprehensive agent lifecycle management.
|
|
2
|
+
|
|
3
|
+
This module provides CLI interface for:
|
|
4
|
+
- Creating and customizing agents
|
|
5
|
+
- Managing agent variants
|
|
6
|
+
- Deploying agents across tiers
|
|
7
|
+
- Customizing PM instructions
|
|
8
|
+
- Discovering and listing agents
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
import shutil
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Any, Dict, List, Optional
|
|
16
|
+
|
|
17
|
+
from ...core.enums import OutputFormat
|
|
18
|
+
from ...core.logging_config import get_logger
|
|
19
|
+
from ...services.agents.agent_builder import AgentBuilderService
|
|
20
|
+
from ...services.agents.deployment.agent_deployment import AgentDeploymentService
|
|
21
|
+
from ..shared import AgentCommand, CommandResult
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class AgentManagerCommand(AgentCommand):
|
|
25
|
+
"""Agent Manager command for comprehensive agent management."""
|
|
26
|
+
|
|
27
|
+
def __init__(self):
|
|
28
|
+
super().__init__("agent-manager")
|
|
29
|
+
self.builder_service = AgentBuilderService()
|
|
30
|
+
self.deployment_service = None
|
|
31
|
+
self.logger = get_logger(__name__)
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def deployment(self):
|
|
35
|
+
"""Lazy load deployment service."""
|
|
36
|
+
if self.deployment_service is None:
|
|
37
|
+
self.deployment_service = AgentDeploymentService()
|
|
38
|
+
return self.deployment_service
|
|
39
|
+
|
|
40
|
+
def _get_output_format(self, args) -> str:
|
|
41
|
+
"""
|
|
42
|
+
Get output format from args with enum default.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
args: Command arguments
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Output format string (compatible with both enum and string usage)
|
|
49
|
+
"""
|
|
50
|
+
return getattr(args, "format", OutputFormat.TEXT)
|
|
51
|
+
|
|
52
|
+
def run(self, args) -> CommandResult:
|
|
53
|
+
"""Execute agent manager command.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
args: Command arguments
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
CommandResult with operation status
|
|
60
|
+
"""
|
|
61
|
+
if not hasattr(args, "agent_manager_command"):
|
|
62
|
+
return self._show_help()
|
|
63
|
+
|
|
64
|
+
command_map = {
|
|
65
|
+
"list": self._list_agents,
|
|
66
|
+
"create": self._create_agent,
|
|
67
|
+
"variant": self._create_variant,
|
|
68
|
+
"deploy": self._deploy_agent,
|
|
69
|
+
"customize-pm": self._customize_pm,
|
|
70
|
+
"show": self._show_agent,
|
|
71
|
+
"test": self._test_agent,
|
|
72
|
+
"templates": self._list_templates,
|
|
73
|
+
"reset": self._reset_agents,
|
|
74
|
+
# Interactive commands
|
|
75
|
+
"create-interactive": self._create_interactive,
|
|
76
|
+
"manage-local": self._manage_local_interactive,
|
|
77
|
+
"edit-interactive": self._edit_interactive,
|
|
78
|
+
"test-local": self._test_local_agent,
|
|
79
|
+
# Local agent commands
|
|
80
|
+
"create-local": self._create_local_agent,
|
|
81
|
+
"deploy-local": self._deploy_local_agents,
|
|
82
|
+
"list-local": self._list_local_agents,
|
|
83
|
+
"sync-local": self._sync_local_agents,
|
|
84
|
+
"export-local": self._export_local_agents,
|
|
85
|
+
"import-local": self._import_local_agents,
|
|
86
|
+
"delete-local": self._delete_local_agents,
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
command = args.agent_manager_command
|
|
90
|
+
if command in command_map:
|
|
91
|
+
return command_map[command](args)
|
|
92
|
+
return CommandResult.error_result(f"Unknown command: {command}")
|
|
93
|
+
|
|
94
|
+
def _list_agents(self, args) -> CommandResult:
|
|
95
|
+
"""List all agents across tiers with hierarchy.
|
|
96
|
+
|
|
97
|
+
Shows agents from:
|
|
98
|
+
1. Project level (.claude/agents/)
|
|
99
|
+
2. User level (~/.claude/agents/)
|
|
100
|
+
3. System level (framework)
|
|
101
|
+
"""
|
|
102
|
+
agents = {"project": [], "user": [], "system": []}
|
|
103
|
+
|
|
104
|
+
# Check project level
|
|
105
|
+
project_dir = Path.cwd() / ".claude" / "agents"
|
|
106
|
+
if project_dir.exists():
|
|
107
|
+
for agent_file in project_dir.glob("*.md"):
|
|
108
|
+
agents["project"].append(
|
|
109
|
+
self._read_agent_summary(agent_file, "project")
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
# Check user level
|
|
113
|
+
user_dir = Path.home() / ".claude" / "agents"
|
|
114
|
+
if user_dir.exists():
|
|
115
|
+
for agent_file in user_dir.glob("*.md"):
|
|
116
|
+
agent_id = agent_file.stem
|
|
117
|
+
# Skip if overridden by project
|
|
118
|
+
if not any(a["id"] == agent_id for a in agents["project"]):
|
|
119
|
+
agents["user"].append(self._read_agent_summary(agent_file, "user"))
|
|
120
|
+
|
|
121
|
+
# Get system agents
|
|
122
|
+
templates = self.builder_service.list_available_templates()
|
|
123
|
+
for template in templates:
|
|
124
|
+
agent_id = template["id"]
|
|
125
|
+
# Skip if overridden by project or user
|
|
126
|
+
if not any(a["id"] == agent_id for a in agents["project"] + agents["user"]):
|
|
127
|
+
agents["system"].append(
|
|
128
|
+
{
|
|
129
|
+
"id": agent_id,
|
|
130
|
+
"name": template["name"],
|
|
131
|
+
"tier": "system",
|
|
132
|
+
"description": template["description"],
|
|
133
|
+
"category": template.get("category", "custom"),
|
|
134
|
+
}
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
# Format output
|
|
138
|
+
output_format = self._get_output_format(args)
|
|
139
|
+
if str(output_format).lower() == OutputFormat.JSON:
|
|
140
|
+
return CommandResult.success_result("Agents listed", data=agents)
|
|
141
|
+
output = self._format_agent_list(agents)
|
|
142
|
+
return CommandResult.success_result(output)
|
|
143
|
+
|
|
144
|
+
def _create_agent(self, args) -> CommandResult:
|
|
145
|
+
"""Create a new agent interactively or from arguments."""
|
|
146
|
+
try:
|
|
147
|
+
# Interactive mode if no arguments
|
|
148
|
+
if not hasattr(args, "agent_id"):
|
|
149
|
+
return self._interactive_create()
|
|
150
|
+
|
|
151
|
+
# Create from arguments
|
|
152
|
+
config, instructions = self.builder_service.create_agent(
|
|
153
|
+
agent_id=args.agent_id,
|
|
154
|
+
name=getattr(args, "name", args.agent_id),
|
|
155
|
+
description=getattr(
|
|
156
|
+
args, "description", f"Custom agent {args.agent_id}"
|
|
157
|
+
),
|
|
158
|
+
model=getattr(args, "model", "sonnet"),
|
|
159
|
+
tool_choice=getattr(args, "tool_choice", "auto"),
|
|
160
|
+
base_template=getattr(args, "template", None),
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
# Save agent files
|
|
164
|
+
result = self._save_agent(config, instructions, args.agent_id)
|
|
165
|
+
|
|
166
|
+
if result:
|
|
167
|
+
return CommandResult.success_result(
|
|
168
|
+
f"Agent '{args.agent_id}' created successfully"
|
|
169
|
+
)
|
|
170
|
+
return CommandResult.error_result("Failed to save agent files")
|
|
171
|
+
|
|
172
|
+
except Exception as e:
|
|
173
|
+
return CommandResult.error_result(f"Failed to create agent: {e}")
|
|
174
|
+
|
|
175
|
+
def _create_variant(self, args) -> CommandResult:
|
|
176
|
+
"""Create an agent variant."""
|
|
177
|
+
try:
|
|
178
|
+
if not hasattr(args, "base_agent"):
|
|
179
|
+
return CommandResult.error_result(
|
|
180
|
+
"Base agent ID required for variant creation"
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
modifications = {}
|
|
184
|
+
if hasattr(args, "model"):
|
|
185
|
+
modifications["model"] = args.model
|
|
186
|
+
if hasattr(args, "tool_choice"):
|
|
187
|
+
modifications["tool_choice"] = args.tool_choice
|
|
188
|
+
|
|
189
|
+
config, instructions = self.builder_service.create_variant(
|
|
190
|
+
base_agent_id=args.base_agent,
|
|
191
|
+
variant_id=args.variant_id,
|
|
192
|
+
variant_name=getattr(args, "name", f"{args.base_agent}-variant"),
|
|
193
|
+
modifications=modifications,
|
|
194
|
+
instructions_append=getattr(args, "instructions", None),
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# Save variant
|
|
198
|
+
result = self._save_agent(config, instructions, args.variant_id)
|
|
199
|
+
|
|
200
|
+
if result:
|
|
201
|
+
return CommandResult.success_result(
|
|
202
|
+
f"Variant '{args.variant_id}' created successfully"
|
|
203
|
+
)
|
|
204
|
+
return CommandResult.error_result("Failed to save variant files")
|
|
205
|
+
|
|
206
|
+
except Exception as e:
|
|
207
|
+
return CommandResult.error_result(f"Failed to create variant: {e}")
|
|
208
|
+
|
|
209
|
+
def _deploy_agent(self, args) -> CommandResult:
|
|
210
|
+
"""Deploy an agent to specified tier."""
|
|
211
|
+
try:
|
|
212
|
+
agent_id = args.agent_id
|
|
213
|
+
tier = getattr(
|
|
214
|
+
args, "tier", "project"
|
|
215
|
+
) # Default to project (changed from 'user')
|
|
216
|
+
|
|
217
|
+
# Always deploy to project directory
|
|
218
|
+
# Regardless of tier, all agents go to project .claude/agents
|
|
219
|
+
deploy_path = Path.cwd() / ".claude" / "agents"
|
|
220
|
+
|
|
221
|
+
# Note: We're keeping the tier parameter for backward compatibility
|
|
222
|
+
# but it no longer affects the deployment location
|
|
223
|
+
if tier not in ["project", "user"]:
|
|
224
|
+
return CommandResult.error_result(
|
|
225
|
+
"Invalid tier. Use 'project' or 'user'"
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
# Create directory if needed
|
|
229
|
+
deploy_path.mkdir(parents=True, exist_ok=True)
|
|
230
|
+
|
|
231
|
+
# Find agent files
|
|
232
|
+
template_dir = Path(__file__).parent.parent.parent / "agents" / "templates"
|
|
233
|
+
json_file = template_dir / f"{agent_id}.json"
|
|
234
|
+
template_dir / f"{agent_id}.md"
|
|
235
|
+
|
|
236
|
+
if not json_file.exists():
|
|
237
|
+
return CommandResult.error_result(f"Agent '{agent_id}' not found")
|
|
238
|
+
|
|
239
|
+
# Deploy using deployment service
|
|
240
|
+
# Pass Path object, not string
|
|
241
|
+
self.deployment.deploy_agent(agent_id, deploy_path)
|
|
242
|
+
|
|
243
|
+
return CommandResult.success_result(
|
|
244
|
+
f"Agent '{agent_id}' deployed to {tier} level"
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
except Exception as e:
|
|
248
|
+
return CommandResult.error_result(f"Deployment failed: {e}")
|
|
249
|
+
|
|
250
|
+
def _customize_pm(self, args) -> CommandResult:
|
|
251
|
+
"""Customize PM instructions via .claude-mpm/INSTRUCTIONS.md."""
|
|
252
|
+
try:
|
|
253
|
+
level = getattr(args, "level", "user")
|
|
254
|
+
|
|
255
|
+
# Use .claude-mpm/INSTRUCTIONS.md for customization
|
|
256
|
+
if level == "user":
|
|
257
|
+
pm_file = Path.home() / ".claude-mpm" / "INSTRUCTIONS.md"
|
|
258
|
+
elif level == "project":
|
|
259
|
+
pm_file = Path.cwd() / ".claude-mpm" / "INSTRUCTIONS.md"
|
|
260
|
+
else:
|
|
261
|
+
return CommandResult.error_result(
|
|
262
|
+
"Invalid level. Use 'user' or 'project'"
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
# Create backup if file exists
|
|
266
|
+
if pm_file.exists():
|
|
267
|
+
backup_file = pm_file.with_suffix(".md.backup")
|
|
268
|
+
shutil.copy(pm_file, backup_file)
|
|
269
|
+
self.logger.info(f"Backup created: {backup_file}")
|
|
270
|
+
|
|
271
|
+
# Generate or load instructions
|
|
272
|
+
if hasattr(args, "template"):
|
|
273
|
+
instructions = self._load_pm_template(args.template)
|
|
274
|
+
else:
|
|
275
|
+
instructions = self.builder_service.generate_pm_instructions(
|
|
276
|
+
delegation_patterns=getattr(args, "patterns", None),
|
|
277
|
+
workflow_overrides=getattr(args, "workflows", None),
|
|
278
|
+
custom_rules=getattr(args, "rules", None),
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
# Save instructions to .claude-mpm directory
|
|
282
|
+
pm_file.parent.mkdir(parents=True, exist_ok=True)
|
|
283
|
+
pm_file.write_text(instructions)
|
|
284
|
+
|
|
285
|
+
return CommandResult.success_result(
|
|
286
|
+
f"PM instructions customized at {level} level: {pm_file}\n"
|
|
287
|
+
f"Note: These instructions will be loaded by the framework loader."
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
except Exception as e:
|
|
291
|
+
return CommandResult.error_result(f"Failed to customize PM: {e}")
|
|
292
|
+
|
|
293
|
+
def _show_agent(self, args) -> CommandResult:
|
|
294
|
+
"""Show detailed agent information."""
|
|
295
|
+
try:
|
|
296
|
+
agent_id = args.agent_id
|
|
297
|
+
|
|
298
|
+
# Find agent across tiers
|
|
299
|
+
agent_info = self._find_agent(agent_id)
|
|
300
|
+
|
|
301
|
+
if not agent_info:
|
|
302
|
+
return CommandResult.error_result(f"Agent '{agent_id}' not found")
|
|
303
|
+
|
|
304
|
+
output_format = self._get_output_format(args)
|
|
305
|
+
if str(output_format).lower() == OutputFormat.JSON:
|
|
306
|
+
return CommandResult.success_result("Agent details", data=agent_info)
|
|
307
|
+
output = self._format_agent_details(agent_info)
|
|
308
|
+
return CommandResult.success_result(output)
|
|
309
|
+
|
|
310
|
+
except Exception as e:
|
|
311
|
+
return CommandResult.error_result(f"Failed to show agent: {e}")
|
|
312
|
+
|
|
313
|
+
def _test_agent(self, args) -> CommandResult:
|
|
314
|
+
"""Test agent configuration."""
|
|
315
|
+
try:
|
|
316
|
+
agent_id = args.agent_id
|
|
317
|
+
|
|
318
|
+
# Find agent configuration
|
|
319
|
+
config = self._load_agent_config(agent_id)
|
|
320
|
+
|
|
321
|
+
if not config:
|
|
322
|
+
return CommandResult.error_result(f"Agent '{agent_id}' not found")
|
|
323
|
+
|
|
324
|
+
# Validate configuration
|
|
325
|
+
errors = self.builder_service.validate_configuration(config)
|
|
326
|
+
|
|
327
|
+
if errors:
|
|
328
|
+
return CommandResult.error_result(
|
|
329
|
+
"Validation failed:\n" + "\n".join(f" - {e}" for e in errors)
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
# Check for conflicts
|
|
333
|
+
conflicts = self._check_conflicts(agent_id)
|
|
334
|
+
|
|
335
|
+
warning = f"Warning: Agent overrides {conflicts}" if conflicts else ""
|
|
336
|
+
|
|
337
|
+
return CommandResult.success_result(
|
|
338
|
+
f"Agent '{agent_id}' configuration is valid. {warning}"
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
except Exception as e:
|
|
342
|
+
return CommandResult.error_result(f"Test failed: {e}")
|
|
343
|
+
|
|
344
|
+
def _list_templates(self, args) -> CommandResult:
|
|
345
|
+
"""List available agent templates."""
|
|
346
|
+
templates = self.builder_service.list_available_templates()
|
|
347
|
+
|
|
348
|
+
output_format = self._get_output_format(args)
|
|
349
|
+
if str(output_format).lower() == OutputFormat.JSON:
|
|
350
|
+
return CommandResult.success_result("Templates listed", data=templates)
|
|
351
|
+
output = "Available Agent Templates:\n\n"
|
|
352
|
+
for template in templates:
|
|
353
|
+
template_id = template.get("id", "unknown")
|
|
354
|
+
template_name = template.get("name", "Unnamed")
|
|
355
|
+
output += f" {template_id:<20} - {template_name}\n"
|
|
356
|
+
if template.get("description"):
|
|
357
|
+
output += f" {template['description']}\n"
|
|
358
|
+
return CommandResult.success_result(output)
|
|
359
|
+
|
|
360
|
+
def _reset_agents(self, args) -> CommandResult:
|
|
361
|
+
"""Reset by removing claude-mpm authored agents from project and user directories.
|
|
362
|
+
|
|
363
|
+
This command removes any agents with "author: claude-mpm" in their frontmatter,
|
|
364
|
+
preserving user-created agents. This is useful for clean reinstalls or when
|
|
365
|
+
wanting to get fresh versions of system agents.
|
|
366
|
+
"""
|
|
367
|
+
try:
|
|
368
|
+
# Determine which directories to clean
|
|
369
|
+
clean_project = not getattr(args, "user_only", False)
|
|
370
|
+
clean_user = not getattr(args, "project_only", False)
|
|
371
|
+
dry_run = getattr(args, "dry_run", False)
|
|
372
|
+
force = getattr(args, "force", False)
|
|
373
|
+
output_format = self._get_output_format(args)
|
|
374
|
+
|
|
375
|
+
# Track results
|
|
376
|
+
results = {
|
|
377
|
+
"project": {"checked": False, "removed": [], "preserved": []},
|
|
378
|
+
"user": {"checked": False, "removed": [], "preserved": []},
|
|
379
|
+
"dry_run": dry_run,
|
|
380
|
+
"total_removed": 0,
|
|
381
|
+
"total_preserved": 0,
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
# Check project directory - always scan first to see what's there
|
|
385
|
+
if clean_project:
|
|
386
|
+
project_dir = Path.cwd() / ".claude" / "agents"
|
|
387
|
+
if project_dir.exists():
|
|
388
|
+
results["project"]["checked"] = True
|
|
389
|
+
# Always scan with dry_run=True first to see what's there
|
|
390
|
+
self._scan_and_clean_directory(
|
|
391
|
+
project_dir, results["project"], dry_run=True
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
# Check user directory - always scan first to see what's there
|
|
395
|
+
if clean_user:
|
|
396
|
+
user_dir = Path.home() / ".claude" / "agents"
|
|
397
|
+
if user_dir.exists():
|
|
398
|
+
results["user"]["checked"] = True
|
|
399
|
+
# Always scan with dry_run=True first to see what's there
|
|
400
|
+
self._scan_and_clean_directory(
|
|
401
|
+
user_dir, results["user"], dry_run=True
|
|
402
|
+
)
|
|
403
|
+
|
|
404
|
+
# Calculate totals
|
|
405
|
+
results["total_removed"] = len(results["project"]["removed"]) + len(
|
|
406
|
+
results["user"]["removed"]
|
|
407
|
+
)
|
|
408
|
+
results["total_preserved"] = len(results["project"]["preserved"]) + len(
|
|
409
|
+
results["user"]["preserved"]
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
# Handle output based on format
|
|
413
|
+
if str(output_format).lower() == OutputFormat.JSON:
|
|
414
|
+
return CommandResult.success_result("Reset completed", data=results)
|
|
415
|
+
|
|
416
|
+
# Generate text output
|
|
417
|
+
output = self._format_reset_results(results, dry_run, force)
|
|
418
|
+
|
|
419
|
+
# If not dry-run, perform actual removal
|
|
420
|
+
if not dry_run and results["total_removed"] > 0:
|
|
421
|
+
# If force mode, remove immediately; otherwise get confirmation
|
|
422
|
+
if not force:
|
|
423
|
+
# Get confirmation first
|
|
424
|
+
print(output)
|
|
425
|
+
print("\n⚠️ This will permanently remove the agents listed above.")
|
|
426
|
+
|
|
427
|
+
# Ensure stdout is flushed before reading input
|
|
428
|
+
sys.stdout.flush()
|
|
429
|
+
|
|
430
|
+
# Get confirmation
|
|
431
|
+
try:
|
|
432
|
+
response = input("Continue? [y/N]: ").strip().lower()
|
|
433
|
+
if response not in ["y", "yes"]:
|
|
434
|
+
return CommandResult.success_result(
|
|
435
|
+
"Reset cancelled by user"
|
|
436
|
+
)
|
|
437
|
+
except (KeyboardInterrupt, EOFError):
|
|
438
|
+
return CommandResult.success_result("\nReset cancelled")
|
|
439
|
+
|
|
440
|
+
# Perform actual removal using the list we already have
|
|
441
|
+
if clean_project and results["project"]["removed"]:
|
|
442
|
+
project_dir = Path.cwd() / ".claude" / "agents"
|
|
443
|
+
for agent in results["project"]["removed"]:
|
|
444
|
+
agent_file = project_dir / agent
|
|
445
|
+
try:
|
|
446
|
+
if agent_file.exists():
|
|
447
|
+
agent_file.unlink()
|
|
448
|
+
self.logger.info(
|
|
449
|
+
f"Removed claude-mpm agent: {agent_file}"
|
|
450
|
+
)
|
|
451
|
+
except Exception as e:
|
|
452
|
+
self.logger.warning(f"Could not remove {agent_file}: {e}")
|
|
453
|
+
|
|
454
|
+
if clean_user and results["user"]["removed"]:
|
|
455
|
+
user_dir = Path.home() / ".claude" / "agents"
|
|
456
|
+
for agent in results["user"]["removed"]:
|
|
457
|
+
agent_file = user_dir / agent
|
|
458
|
+
try:
|
|
459
|
+
if agent_file.exists():
|
|
460
|
+
agent_file.unlink()
|
|
461
|
+
self.logger.info(
|
|
462
|
+
f"Removed claude-mpm agent: {agent_file}"
|
|
463
|
+
)
|
|
464
|
+
except Exception as e:
|
|
465
|
+
self.logger.warning(f"Could not remove {agent_file}: {e}")
|
|
466
|
+
|
|
467
|
+
# Update output to show actual removal
|
|
468
|
+
output = self._format_reset_results(results, dry_run=False, force=force)
|
|
469
|
+
|
|
470
|
+
return CommandResult.success_result(output)
|
|
471
|
+
|
|
472
|
+
except Exception as e:
|
|
473
|
+
self.logger.error(f"Failed to reset agents: {e}", exc_info=True)
|
|
474
|
+
return CommandResult.error_result(f"Failed to reset agents: {e}")
|
|
475
|
+
|
|
476
|
+
def _scan_and_clean_directory(
|
|
477
|
+
self, directory: Path, results: Dict[str, Any], dry_run: bool
|
|
478
|
+
) -> None:
|
|
479
|
+
"""Scan a directory for claude-mpm authored agents and optionally remove them.
|
|
480
|
+
|
|
481
|
+
Args:
|
|
482
|
+
directory: Directory to scan
|
|
483
|
+
results: Results dictionary to update
|
|
484
|
+
dry_run: If True, only scan without removing
|
|
485
|
+
"""
|
|
486
|
+
for agent_file in directory.glob("*.md"):
|
|
487
|
+
try:
|
|
488
|
+
content = agent_file.read_text()
|
|
489
|
+
# Check if this is a claude-mpm authored agent
|
|
490
|
+
if "author: claude-mpm" in content.lower():
|
|
491
|
+
results["removed"].append(agent_file.name)
|
|
492
|
+
if not dry_run:
|
|
493
|
+
agent_file.unlink()
|
|
494
|
+
self.logger.info(f"Removed claude-mpm agent: {agent_file}")
|
|
495
|
+
else:
|
|
496
|
+
results["preserved"].append(agent_file.name)
|
|
497
|
+
self.logger.debug(f"Preserved user agent: {agent_file}")
|
|
498
|
+
except Exception as e:
|
|
499
|
+
self.logger.warning(f"Could not process {agent_file}: {e}")
|
|
500
|
+
|
|
501
|
+
def _format_reset_results(
|
|
502
|
+
self, results: Dict[str, Any], dry_run: bool, force: bool
|
|
503
|
+
) -> str:
|
|
504
|
+
"""Format reset results for display.
|
|
505
|
+
|
|
506
|
+
Args:
|
|
507
|
+
results: Results dictionary
|
|
508
|
+
dry_run: Whether this was a dry run
|
|
509
|
+
force: Whether force mode was used
|
|
510
|
+
|
|
511
|
+
Returns:
|
|
512
|
+
Formatted output string
|
|
513
|
+
"""
|
|
514
|
+
if dry_run:
|
|
515
|
+
output = "🔍 DRY RUN - No changes will be made\n"
|
|
516
|
+
output += "=" * 50 + "\n\n"
|
|
517
|
+
else:
|
|
518
|
+
output = "🧹 Agent Reset Complete\n"
|
|
519
|
+
output += "=" * 50 + "\n\n"
|
|
520
|
+
|
|
521
|
+
# Show project results
|
|
522
|
+
if results["project"]["checked"]:
|
|
523
|
+
output += "📁 Project Level (.claude/agents):\n"
|
|
524
|
+
if results["project"]["removed"]:
|
|
525
|
+
action = "Would remove" if dry_run else "Removed"
|
|
526
|
+
output += f" {action} {len(results['project']['removed'])} claude-mpm agent(s):\n"
|
|
527
|
+
for agent in results["project"]["removed"][:5]:
|
|
528
|
+
output += f" • {agent}\n"
|
|
529
|
+
if len(results["project"]["removed"]) > 5:
|
|
530
|
+
output += (
|
|
531
|
+
f" ... and {len(results['project']['removed']) - 5} more\n"
|
|
532
|
+
)
|
|
533
|
+
else:
|
|
534
|
+
output += " No claude-mpm agents found\n"
|
|
535
|
+
|
|
536
|
+
if results["project"]["preserved"]:
|
|
537
|
+
output += f" Preserved {len(results['project']['preserved'])} user-created agent(s)\n"
|
|
538
|
+
output += "\n"
|
|
539
|
+
|
|
540
|
+
# Show user results
|
|
541
|
+
if results["user"]["checked"]:
|
|
542
|
+
output += "📁 User Level (~/.claude/agents):\n"
|
|
543
|
+
if results["user"]["removed"]:
|
|
544
|
+
action = "Would remove" if dry_run else "Removed"
|
|
545
|
+
output += f" {action} {len(results['user']['removed'])} claude-mpm agent(s):\n"
|
|
546
|
+
for agent in results["user"]["removed"][:5]:
|
|
547
|
+
output += f" • {agent}\n"
|
|
548
|
+
if len(results["user"]["removed"]) > 5:
|
|
549
|
+
output += (
|
|
550
|
+
f" ... and {len(results['user']['removed']) - 5} more\n"
|
|
551
|
+
)
|
|
552
|
+
else:
|
|
553
|
+
output += " No claude-mpm agents found\n"
|
|
554
|
+
|
|
555
|
+
if results["user"]["preserved"]:
|
|
556
|
+
output += f" Preserved {len(results['user']['preserved'])} user-created agent(s)\n"
|
|
557
|
+
output += "\n"
|
|
558
|
+
|
|
559
|
+
# Show summary
|
|
560
|
+
output += "📊 Summary:\n"
|
|
561
|
+
if dry_run:
|
|
562
|
+
output += f" • Would remove: {results['total_removed']} agent(s)\n"
|
|
563
|
+
else:
|
|
564
|
+
output += f" • Removed: {results['total_removed']} agent(s)\n"
|
|
565
|
+
output += f" • Preserved: {results['total_preserved']} user agent(s)\n"
|
|
566
|
+
|
|
567
|
+
if dry_run and results["total_removed"] > 0:
|
|
568
|
+
output += "\n💡 Run with --force to execute this cleanup immediately"
|
|
569
|
+
|
|
570
|
+
return output
|
|
571
|
+
|
|
572
|
+
def _interactive_create(self) -> CommandResult:
|
|
573
|
+
"""Interactive agent creation wizard."""
|
|
574
|
+
print("\n=== Agent Creation Wizard ===\n")
|
|
575
|
+
|
|
576
|
+
# Get agent ID
|
|
577
|
+
agent_id = input("Agent ID (lowercase, hyphens only): ").strip()
|
|
578
|
+
if not agent_id:
|
|
579
|
+
return CommandResult.error_result("Agent ID is required")
|
|
580
|
+
|
|
581
|
+
# Get name
|
|
582
|
+
name = input(f"Display name [{agent_id}]: ").strip() or agent_id
|
|
583
|
+
|
|
584
|
+
# Get description
|
|
585
|
+
description = input("Description: ").strip()
|
|
586
|
+
if not description:
|
|
587
|
+
return CommandResult.error_result("Description is required")
|
|
588
|
+
|
|
589
|
+
# Get model
|
|
590
|
+
print("\nAvailable models: sonnet, opus, haiku")
|
|
591
|
+
model = input("Model [sonnet]: ").strip() or "sonnet"
|
|
592
|
+
|
|
593
|
+
# Get tool choice
|
|
594
|
+
print("\nTool choices: auto, required, any, none")
|
|
595
|
+
tool_choice = input("Tool choice [auto]: ").strip() or "auto"
|
|
596
|
+
|
|
597
|
+
# Create agent
|
|
598
|
+
try:
|
|
599
|
+
config, instructions = self.builder_service.create_agent(
|
|
600
|
+
agent_id=agent_id,
|
|
601
|
+
name=name,
|
|
602
|
+
description=description,
|
|
603
|
+
model=model,
|
|
604
|
+
tool_choice=tool_choice,
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
# Save agent
|
|
608
|
+
if self._save_agent(config, instructions, agent_id):
|
|
609
|
+
return CommandResult.success_result(
|
|
610
|
+
f"\nAgent '{agent_id}' created successfully!"
|
|
611
|
+
)
|
|
612
|
+
return CommandResult.error_result("Failed to save agent files")
|
|
613
|
+
|
|
614
|
+
except Exception as e:
|
|
615
|
+
return CommandResult.error_result(f"Creation failed: {e}")
|
|
616
|
+
|
|
617
|
+
def _save_agent(
|
|
618
|
+
self, config: Dict[str, Any], instructions: str, agent_id: str
|
|
619
|
+
) -> bool:
|
|
620
|
+
"""Save agent configuration and instructions.
|
|
621
|
+
|
|
622
|
+
Args:
|
|
623
|
+
config: Agent configuration dictionary
|
|
624
|
+
instructions: Agent instructions markdown
|
|
625
|
+
agent_id: Agent identifier
|
|
626
|
+
|
|
627
|
+
Returns:
|
|
628
|
+
True if saved successfully
|
|
629
|
+
"""
|
|
630
|
+
try:
|
|
631
|
+
template_dir = Path(__file__).parent.parent.parent / "agents" / "templates"
|
|
632
|
+
template_dir.mkdir(parents=True, exist_ok=True)
|
|
633
|
+
|
|
634
|
+
# Save JSON configuration
|
|
635
|
+
json_file = template_dir / f"{agent_id}.json"
|
|
636
|
+
with json_file.open("w") as f:
|
|
637
|
+
json.dump(config, f, indent=2)
|
|
638
|
+
|
|
639
|
+
# Save instructions
|
|
640
|
+
md_file = template_dir / f"{agent_id}.md"
|
|
641
|
+
md_file.write_text(instructions)
|
|
642
|
+
|
|
643
|
+
self.logger.info(f"Agent saved: {json_file} and {md_file}")
|
|
644
|
+
return True
|
|
645
|
+
|
|
646
|
+
except Exception as e:
|
|
647
|
+
self.logger.error(f"Failed to save agent: {e}")
|
|
648
|
+
return False
|
|
649
|
+
|
|
650
|
+
def _read_agent_summary(self, agent_file: Path, tier: str) -> Dict[str, Any]:
|
|
651
|
+
"""Read agent summary from file."""
|
|
652
|
+
try:
|
|
653
|
+
agent_id = agent_file.stem
|
|
654
|
+
content = agent_file.read_text()
|
|
655
|
+
|
|
656
|
+
# Parse frontmatter for .md files
|
|
657
|
+
if agent_file.suffix == ".md" and content.startswith("---"):
|
|
658
|
+
import yaml
|
|
659
|
+
|
|
660
|
+
try:
|
|
661
|
+
# Extract YAML frontmatter
|
|
662
|
+
parts = content.split("---", 2)
|
|
663
|
+
if len(parts) >= 2:
|
|
664
|
+
frontmatter = yaml.safe_load(parts[1])
|
|
665
|
+
if isinstance(frontmatter, dict):
|
|
666
|
+
return {
|
|
667
|
+
"id": agent_id,
|
|
668
|
+
"name": frontmatter.get(
|
|
669
|
+
"name", agent_id.replace("-", " ").title()
|
|
670
|
+
),
|
|
671
|
+
"tier": tier,
|
|
672
|
+
"file": str(agent_file),
|
|
673
|
+
"description": frontmatter.get("description", ""),
|
|
674
|
+
"is_local": frontmatter.get("is_local", False),
|
|
675
|
+
"priority": frontmatter.get("priority", 1000),
|
|
676
|
+
}
|
|
677
|
+
except Exception:
|
|
678
|
+
pass
|
|
679
|
+
|
|
680
|
+
# Fallback for files without proper frontmatter
|
|
681
|
+
return {
|
|
682
|
+
"id": agent_id,
|
|
683
|
+
"name": agent_id.replace("-", " ").title(),
|
|
684
|
+
"tier": tier,
|
|
685
|
+
"file": str(agent_file),
|
|
686
|
+
}
|
|
687
|
+
except Exception:
|
|
688
|
+
return {}
|
|
689
|
+
|
|
690
|
+
def _format_agent_list(self, agents: Dict[str, List]) -> str:
|
|
691
|
+
"""Format agent list for display."""
|
|
692
|
+
output = "=== Agent Hierarchy ===\n\n"
|
|
693
|
+
|
|
694
|
+
# Project agents
|
|
695
|
+
if agents["project"]:
|
|
696
|
+
output += "[P] PROJECT LEVEL (Highest Priority)\n"
|
|
697
|
+
for agent in agents["project"]:
|
|
698
|
+
local_indicator = " [LOCAL-PROJECT]" if agent.get("is_local") else ""
|
|
699
|
+
output += f" {agent['id']:<20} - {agent.get('name', agent['id'])}{local_indicator}\n"
|
|
700
|
+
output += "\n"
|
|
701
|
+
|
|
702
|
+
# User agents
|
|
703
|
+
if agents["user"]:
|
|
704
|
+
output += "[U] USER LEVEL\n"
|
|
705
|
+
for agent in agents["user"]:
|
|
706
|
+
local_indicator = " [LOCAL-USER]" if agent.get("is_local") else ""
|
|
707
|
+
output += f" {agent['id']:<20} - {agent.get('name', agent['id'])}{local_indicator}\n"
|
|
708
|
+
output += "\n"
|
|
709
|
+
|
|
710
|
+
# System agents
|
|
711
|
+
if agents["system"]:
|
|
712
|
+
output += "[S] SYSTEM LEVEL (Framework Defaults)\n"
|
|
713
|
+
for agent in agents["system"]:
|
|
714
|
+
output += f" {agent['id']:<20} - {agent.get('name', agent['id'])}\n"
|
|
715
|
+
|
|
716
|
+
return output
|
|
717
|
+
|
|
718
|
+
def _find_agent(self, agent_id: str) -> Optional[Dict[str, Any]]:
|
|
719
|
+
"""Find agent across all tiers."""
|
|
720
|
+
# Implementation would search across tiers
|
|
721
|
+
# This is a simplified version
|
|
722
|
+
return {"id": agent_id, "tier": "system"}
|
|
723
|
+
|
|
724
|
+
def _load_agent_config(self, agent_id: str) -> Optional[Dict[str, Any]]:
|
|
725
|
+
"""Load agent configuration."""
|
|
726
|
+
try:
|
|
727
|
+
return self.builder_service._load_template(agent_id)
|
|
728
|
+
except Exception:
|
|
729
|
+
return None
|
|
730
|
+
|
|
731
|
+
def _check_conflicts(self, agent_id: str) -> Optional[str]:
|
|
732
|
+
"""Check for agent conflicts across tiers."""
|
|
733
|
+
# Check if agent exists in multiple tiers
|
|
734
|
+
# Return tier information if conflicts exist
|
|
735
|
+
return None
|
|
736
|
+
|
|
737
|
+
def _format_agent_details(self, agent_info: Dict[str, Any]) -> str:
|
|
738
|
+
"""Format agent details for display."""
|
|
739
|
+
output = f"=== Agent: {agent_info['id']} ===\n\n"
|
|
740
|
+
for key, value in agent_info.items():
|
|
741
|
+
output += f"{key}: {value}\n"
|
|
742
|
+
return output
|
|
743
|
+
|
|
744
|
+
def _load_pm_template(self, template_name: str) -> str:
|
|
745
|
+
"""Load PM instruction template."""
|
|
746
|
+
# Load predefined PM templates
|
|
747
|
+
return "# PM Instructions Template\n"
|
|
748
|
+
|
|
749
|
+
def _create_local_agent(self, args) -> CommandResult:
|
|
750
|
+
"""Create a new local agent template.
|
|
751
|
+
|
|
752
|
+
Creates a JSON template in .claude-mpm/agents/ directory.
|
|
753
|
+
"""
|
|
754
|
+
try:
|
|
755
|
+
from ...services.agents.local_template_manager import (
|
|
756
|
+
LocalAgentTemplateManager,
|
|
757
|
+
)
|
|
758
|
+
|
|
759
|
+
manager = LocalAgentTemplateManager()
|
|
760
|
+
|
|
761
|
+
# Get arguments
|
|
762
|
+
agent_id = getattr(args, "agent_id", None)
|
|
763
|
+
if not agent_id:
|
|
764
|
+
return CommandResult.error_result(
|
|
765
|
+
"--agent-id is required for create-local"
|
|
766
|
+
)
|
|
767
|
+
|
|
768
|
+
name = getattr(args, "name", agent_id.replace("_", " ").title())
|
|
769
|
+
description = getattr(args, "description", f"Local {agent_id} agent")
|
|
770
|
+
instructions = getattr(
|
|
771
|
+
args, "instructions", f"Custom instructions for {agent_id}"
|
|
772
|
+
)
|
|
773
|
+
model = getattr(args, "model", "sonnet")
|
|
774
|
+
tools = getattr(args, "tools", "*")
|
|
775
|
+
parent_agent = getattr(args, "parent", None)
|
|
776
|
+
tier = getattr(args, "tier", "project")
|
|
777
|
+
|
|
778
|
+
# Create template
|
|
779
|
+
template = manager.create_local_template(
|
|
780
|
+
agent_id=agent_id,
|
|
781
|
+
name=name,
|
|
782
|
+
description=description,
|
|
783
|
+
instructions=instructions,
|
|
784
|
+
model=model,
|
|
785
|
+
tools=tools,
|
|
786
|
+
parent_agent=parent_agent,
|
|
787
|
+
tier=tier,
|
|
788
|
+
)
|
|
789
|
+
|
|
790
|
+
# Validate template
|
|
791
|
+
is_valid, errors = manager.validate_local_template(template)
|
|
792
|
+
if not is_valid:
|
|
793
|
+
return CommandResult.error_result(
|
|
794
|
+
f"Invalid template: {', '.join(errors)}"
|
|
795
|
+
)
|
|
796
|
+
|
|
797
|
+
# Save template
|
|
798
|
+
template_file = manager.save_local_template(template, tier)
|
|
799
|
+
|
|
800
|
+
return CommandResult.success_result(
|
|
801
|
+
f"Created local agent template: {template_file}\n"
|
|
802
|
+
f"Deploy with: claude-mpm agent-manager deploy-local --agent-id {agent_id}"
|
|
803
|
+
)
|
|
804
|
+
|
|
805
|
+
except Exception as e:
|
|
806
|
+
return CommandResult.error_result(f"Failed to create local agent: {e}")
|
|
807
|
+
|
|
808
|
+
def _deploy_local_agents(self, args) -> CommandResult:
|
|
809
|
+
"""Deploy local JSON templates to Claude Code."""
|
|
810
|
+
try:
|
|
811
|
+
from ...services.agents.deployment.local_template_deployment import (
|
|
812
|
+
LocalTemplateDeploymentService,
|
|
813
|
+
)
|
|
814
|
+
|
|
815
|
+
service = LocalTemplateDeploymentService()
|
|
816
|
+
|
|
817
|
+
# Check for specific agent
|
|
818
|
+
agent_id = getattr(args, "agent_id", None)
|
|
819
|
+
force = getattr(args, "force", False)
|
|
820
|
+
|
|
821
|
+
if agent_id:
|
|
822
|
+
# Deploy single agent
|
|
823
|
+
success = service.deploy_single_local_template(agent_id, force)
|
|
824
|
+
if success:
|
|
825
|
+
return CommandResult.success_result(
|
|
826
|
+
f"Deployed local agent: {agent_id}"
|
|
827
|
+
)
|
|
828
|
+
return CommandResult.error_result(
|
|
829
|
+
f"Failed to deploy local agent: {agent_id}"
|
|
830
|
+
)
|
|
831
|
+
|
|
832
|
+
# Deploy all local agents
|
|
833
|
+
tier_filter = getattr(args, "tier", None)
|
|
834
|
+
results = service.deploy_local_templates(force, tier_filter)
|
|
835
|
+
|
|
836
|
+
# Format output
|
|
837
|
+
output = "Local Agent Deployment Results:\n"
|
|
838
|
+
output += f" Deployed: {len(results['deployed'])}\n"
|
|
839
|
+
output += f" Updated: {len(results['updated'])}\n"
|
|
840
|
+
output += f" Skipped: {len(results['skipped'])}\n"
|
|
841
|
+
output += f" Errors: {len(results['errors'])}\n"
|
|
842
|
+
|
|
843
|
+
if results["deployed"]:
|
|
844
|
+
output += f"\nDeployed agents: {', '.join(results['deployed'])}"
|
|
845
|
+
if results["updated"]:
|
|
846
|
+
output += f"\nUpdated agents: {', '.join(results['updated'])}"
|
|
847
|
+
if results["errors"]:
|
|
848
|
+
output += "\nErrors:\n"
|
|
849
|
+
for error in results["errors"]:
|
|
850
|
+
output += f" - {error}\n"
|
|
851
|
+
|
|
852
|
+
return CommandResult.success_result(output, data=results)
|
|
853
|
+
|
|
854
|
+
except Exception as e:
|
|
855
|
+
return CommandResult.error_result(f"Failed to deploy local agents: {e}")
|
|
856
|
+
|
|
857
|
+
def _list_local_agents(self, args) -> CommandResult:
|
|
858
|
+
"""List all local agent templates."""
|
|
859
|
+
try:
|
|
860
|
+
from ...services.agents.local_template_manager import (
|
|
861
|
+
LocalAgentTemplateManager,
|
|
862
|
+
)
|
|
863
|
+
|
|
864
|
+
manager = LocalAgentTemplateManager()
|
|
865
|
+
|
|
866
|
+
# Get tier filter
|
|
867
|
+
tier = getattr(args, "tier", None)
|
|
868
|
+
templates = manager.list_local_templates(tier)
|
|
869
|
+
|
|
870
|
+
if not templates:
|
|
871
|
+
return CommandResult.success_result("No local agent templates found")
|
|
872
|
+
|
|
873
|
+
# Format output
|
|
874
|
+
output_format = self._get_output_format(args)
|
|
875
|
+
|
|
876
|
+
if str(output_format).lower() == OutputFormat.JSON:
|
|
877
|
+
data = [
|
|
878
|
+
{
|
|
879
|
+
"id": t.agent_id,
|
|
880
|
+
"name": t.metadata.get("name", t.agent_id),
|
|
881
|
+
"version": t.agent_version,
|
|
882
|
+
"author": t.author,
|
|
883
|
+
"tier": t.tier,
|
|
884
|
+
"tags": t.metadata.get("tags", []),
|
|
885
|
+
}
|
|
886
|
+
for t in templates
|
|
887
|
+
]
|
|
888
|
+
return CommandResult.success_result("Local agents", data=data)
|
|
889
|
+
|
|
890
|
+
# Text format
|
|
891
|
+
output = "Local Agent Templates:\n\n"
|
|
892
|
+
|
|
893
|
+
# Group by tier
|
|
894
|
+
project_agents = [t for t in templates if t.tier == "project"]
|
|
895
|
+
user_agents = [t for t in templates if t.tier == "user"]
|
|
896
|
+
|
|
897
|
+
if project_agents:
|
|
898
|
+
output += "PROJECT AGENTS:\n"
|
|
899
|
+
for template in project_agents:
|
|
900
|
+
output += f" • {template.agent_id} (v{template.agent_version})"
|
|
901
|
+
output += f" - {template.metadata.get('name', template.agent_id)}\n"
|
|
902
|
+
if template.metadata.get("description"):
|
|
903
|
+
output += f" {template.metadata['description']}\n"
|
|
904
|
+
output += "\n"
|
|
905
|
+
|
|
906
|
+
if user_agents:
|
|
907
|
+
output += "USER AGENTS:\n"
|
|
908
|
+
for template in user_agents:
|
|
909
|
+
output += f" • {template.agent_id} (v{template.agent_version})"
|
|
910
|
+
output += f" - {template.metadata.get('name', template.agent_id)}\n"
|
|
911
|
+
if template.metadata.get("description"):
|
|
912
|
+
output += f" {template.metadata['description']}\n"
|
|
913
|
+
|
|
914
|
+
return CommandResult.success_result(output)
|
|
915
|
+
|
|
916
|
+
except Exception as e:
|
|
917
|
+
return CommandResult.error_result(f"Failed to list local agents: {e}")
|
|
918
|
+
|
|
919
|
+
def _sync_local_agents(self, args) -> CommandResult:
|
|
920
|
+
"""Synchronize local templates with deployed agents."""
|
|
921
|
+
try:
|
|
922
|
+
from ...services.agents.deployment.local_template_deployment import (
|
|
923
|
+
LocalTemplateDeploymentService,
|
|
924
|
+
)
|
|
925
|
+
|
|
926
|
+
service = LocalTemplateDeploymentService()
|
|
927
|
+
results = service.sync_local_templates()
|
|
928
|
+
|
|
929
|
+
# Format output
|
|
930
|
+
output = "Local Agent Synchronization:\n"
|
|
931
|
+
output += f" Added: {len(results['added'])}\n"
|
|
932
|
+
output += f" Updated: {len(results['updated'])}\n"
|
|
933
|
+
output += f" Removed: {len(results['removed'])}\n"
|
|
934
|
+
|
|
935
|
+
if results["added"]:
|
|
936
|
+
output += f"\nAdded agents: {', '.join(results['added'])}"
|
|
937
|
+
if results["updated"]:
|
|
938
|
+
output += f"\nUpdated agents: {', '.join(results['updated'])}"
|
|
939
|
+
if results["removed"]:
|
|
940
|
+
output += f"\nRemoved agents: {', '.join(results['removed'])}"
|
|
941
|
+
if results["errors"]:
|
|
942
|
+
output += "\nErrors:\n"
|
|
943
|
+
for error in results["errors"]:
|
|
944
|
+
output += f" - {error}\n"
|
|
945
|
+
|
|
946
|
+
return CommandResult.success_result(output, data=results)
|
|
947
|
+
|
|
948
|
+
except Exception as e:
|
|
949
|
+
return CommandResult.error_result(f"Failed to sync local agents: {e}")
|
|
950
|
+
|
|
951
|
+
def _export_local_agents(self, args) -> CommandResult:
|
|
952
|
+
"""Export local agent templates to a directory."""
|
|
953
|
+
try:
|
|
954
|
+
from ...services.agents.local_template_manager import (
|
|
955
|
+
LocalAgentTemplateManager,
|
|
956
|
+
)
|
|
957
|
+
|
|
958
|
+
manager = LocalAgentTemplateManager()
|
|
959
|
+
|
|
960
|
+
# Get output directory
|
|
961
|
+
output_dir = getattr(args, "output", "./exported-agents")
|
|
962
|
+
output_path = Path(output_dir)
|
|
963
|
+
|
|
964
|
+
count = manager.export_local_templates(output_path)
|
|
965
|
+
|
|
966
|
+
return CommandResult.success_result(
|
|
967
|
+
f"Exported {count} local agent templates to {output_path}"
|
|
968
|
+
)
|
|
969
|
+
|
|
970
|
+
except Exception as e:
|
|
971
|
+
return CommandResult.error_result(f"Failed to export local agents: {e}")
|
|
972
|
+
|
|
973
|
+
def _import_local_agents(self, args) -> CommandResult:
|
|
974
|
+
"""Import agent templates from a directory."""
|
|
975
|
+
try:
|
|
976
|
+
from ...services.agents.local_template_manager import (
|
|
977
|
+
LocalAgentTemplateManager,
|
|
978
|
+
)
|
|
979
|
+
|
|
980
|
+
manager = LocalAgentTemplateManager()
|
|
981
|
+
|
|
982
|
+
# Get input directory
|
|
983
|
+
input_dir = getattr(args, "input", None)
|
|
984
|
+
if not input_dir:
|
|
985
|
+
return CommandResult.error_result("--input directory is required")
|
|
986
|
+
|
|
987
|
+
input_path = Path(input_dir)
|
|
988
|
+
if not input_path.exists():
|
|
989
|
+
return CommandResult.error_result(
|
|
990
|
+
f"Input directory does not exist: {input_path}"
|
|
991
|
+
)
|
|
992
|
+
|
|
993
|
+
# Get tier
|
|
994
|
+
tier = getattr(args, "tier", "project")
|
|
995
|
+
|
|
996
|
+
count = manager.import_local_templates(input_path, tier)
|
|
997
|
+
|
|
998
|
+
return CommandResult.success_result(
|
|
999
|
+
f"Imported {count} local agent templates from {input_path}"
|
|
1000
|
+
)
|
|
1001
|
+
|
|
1002
|
+
except Exception as e:
|
|
1003
|
+
return CommandResult.error_result(f"Failed to import local agents: {e}")
|
|
1004
|
+
|
|
1005
|
+
def _create_interactive(self, args) -> CommandResult:
|
|
1006
|
+
"""Launch interactive agent creation wizard."""
|
|
1007
|
+
try:
|
|
1008
|
+
from ...cli.interactive.agent_wizard import run_interactive_agent_wizard
|
|
1009
|
+
|
|
1010
|
+
# Run the interactive wizard
|
|
1011
|
+
exit_code = run_interactive_agent_wizard()
|
|
1012
|
+
|
|
1013
|
+
if exit_code == 0:
|
|
1014
|
+
return CommandResult.success_result(
|
|
1015
|
+
"Interactive agent creation completed"
|
|
1016
|
+
)
|
|
1017
|
+
return CommandResult.error_result(
|
|
1018
|
+
"Interactive agent creation failed or cancelled"
|
|
1019
|
+
)
|
|
1020
|
+
|
|
1021
|
+
except Exception as e:
|
|
1022
|
+
return CommandResult.error_result(f"Interactive creation failed: {e}")
|
|
1023
|
+
|
|
1024
|
+
def _manage_local_interactive(self, args) -> CommandResult:
|
|
1025
|
+
"""Launch interactive agent management menu."""
|
|
1026
|
+
try:
|
|
1027
|
+
from ...cli.interactive.agent_wizard import run_interactive_agent_manager
|
|
1028
|
+
|
|
1029
|
+
# Run the interactive management menu
|
|
1030
|
+
exit_code = run_interactive_agent_manager()
|
|
1031
|
+
|
|
1032
|
+
if exit_code == 0:
|
|
1033
|
+
return CommandResult.success_result(
|
|
1034
|
+
"Interactive agent management completed"
|
|
1035
|
+
)
|
|
1036
|
+
return CommandResult.error_result(
|
|
1037
|
+
"Interactive agent management failed or cancelled"
|
|
1038
|
+
)
|
|
1039
|
+
|
|
1040
|
+
except Exception as e:
|
|
1041
|
+
return CommandResult.error_result(f"Interactive management failed: {e}")
|
|
1042
|
+
|
|
1043
|
+
def _edit_interactive(self, args) -> CommandResult:
|
|
1044
|
+
"""Edit agent configuration interactively."""
|
|
1045
|
+
try:
|
|
1046
|
+
from ...services.agents.local_template_manager import (
|
|
1047
|
+
LocalAgentTemplateManager,
|
|
1048
|
+
)
|
|
1049
|
+
|
|
1050
|
+
agent_id = getattr(args, "agent_id", None)
|
|
1051
|
+
if not agent_id:
|
|
1052
|
+
return CommandResult.error_result(
|
|
1053
|
+
"--agent-id is required for edit-interactive"
|
|
1054
|
+
)
|
|
1055
|
+
|
|
1056
|
+
manager = LocalAgentTemplateManager()
|
|
1057
|
+
template = manager.get_local_template(agent_id)
|
|
1058
|
+
|
|
1059
|
+
if not template:
|
|
1060
|
+
return CommandResult.error_result(f"Local agent '{agent_id}' not found")
|
|
1061
|
+
|
|
1062
|
+
# Get template file path
|
|
1063
|
+
if template.tier == "project":
|
|
1064
|
+
template_file = manager.project_agents_dir / f"{agent_id}.json"
|
|
1065
|
+
else:
|
|
1066
|
+
template_file = manager.user_agents_dir / f"{agent_id}.json"
|
|
1067
|
+
|
|
1068
|
+
# Open in editor
|
|
1069
|
+
import os
|
|
1070
|
+
import subprocess
|
|
1071
|
+
|
|
1072
|
+
editor = os.environ.get("EDITOR", "nano")
|
|
1073
|
+
print(f"Opening {template_file} in {editor}...")
|
|
1074
|
+
|
|
1075
|
+
try:
|
|
1076
|
+
subprocess.run([editor, str(template_file)], check=True)
|
|
1077
|
+
return CommandResult.success_result(
|
|
1078
|
+
f"Agent '{agent_id}' edited successfully"
|
|
1079
|
+
)
|
|
1080
|
+
except subprocess.CalledProcessError:
|
|
1081
|
+
return CommandResult.error_result("Editor exited with error")
|
|
1082
|
+
except FileNotFoundError:
|
|
1083
|
+
return CommandResult.error_result(
|
|
1084
|
+
f"Editor '{editor}' not found. Set EDITOR environment variable."
|
|
1085
|
+
)
|
|
1086
|
+
|
|
1087
|
+
except Exception as e:
|
|
1088
|
+
return CommandResult.error_result(f"Interactive edit failed: {e}")
|
|
1089
|
+
|
|
1090
|
+
def _test_local_agent(self, args) -> CommandResult:
|
|
1091
|
+
"""Test a local agent with sample task."""
|
|
1092
|
+
try:
|
|
1093
|
+
from ...services.agents.local_template_manager import (
|
|
1094
|
+
LocalAgentTemplateManager,
|
|
1095
|
+
)
|
|
1096
|
+
|
|
1097
|
+
agent_id = getattr(args, "agent_id", None)
|
|
1098
|
+
if not agent_id:
|
|
1099
|
+
return CommandResult.error_result(
|
|
1100
|
+
"--agent-id is required for test-local"
|
|
1101
|
+
)
|
|
1102
|
+
|
|
1103
|
+
manager = LocalAgentTemplateManager()
|
|
1104
|
+
template = manager.get_local_template(agent_id)
|
|
1105
|
+
|
|
1106
|
+
if not template:
|
|
1107
|
+
return CommandResult.error_result(f"Local agent '{agent_id}' not found")
|
|
1108
|
+
|
|
1109
|
+
# Validate template
|
|
1110
|
+
is_valid, errors = manager.validate_local_template(template)
|
|
1111
|
+
|
|
1112
|
+
if not is_valid:
|
|
1113
|
+
error_msg = f"Agent '{agent_id}' validation failed:\n"
|
|
1114
|
+
error_msg += "\n".join(f" • {error}" for error in errors)
|
|
1115
|
+
return CommandResult.error_result(error_msg)
|
|
1116
|
+
|
|
1117
|
+
# Check if agent is deployed
|
|
1118
|
+
from ...services.agents.deployment.local_template_deployment import (
|
|
1119
|
+
LocalTemplateDeploymentService,
|
|
1120
|
+
)
|
|
1121
|
+
|
|
1122
|
+
deployment_service = LocalTemplateDeploymentService()
|
|
1123
|
+
|
|
1124
|
+
# Test deployment
|
|
1125
|
+
try:
|
|
1126
|
+
success = deployment_service.deploy_single_local_template(
|
|
1127
|
+
agent_id, force=True
|
|
1128
|
+
)
|
|
1129
|
+
if not success:
|
|
1130
|
+
return CommandResult.error_result(
|
|
1131
|
+
f"Failed to deploy agent '{agent_id}' for testing"
|
|
1132
|
+
)
|
|
1133
|
+
except Exception as deploy_error:
|
|
1134
|
+
return CommandResult.error_result(f"Deployment failed: {deploy_error}")
|
|
1135
|
+
|
|
1136
|
+
# Success message with usage instructions
|
|
1137
|
+
success_msg = (
|
|
1138
|
+
f"✅ Agent '{agent_id}' is valid and deployed successfully!\n\n"
|
|
1139
|
+
)
|
|
1140
|
+
success_msg += "🧪 Test your agent:\n"
|
|
1141
|
+
success_msg += (
|
|
1142
|
+
f' claude-mpm run --agent {agent_id} "Test task for this agent"\n\n'
|
|
1143
|
+
)
|
|
1144
|
+
success_msg += "📊 Agent Details:\n"
|
|
1145
|
+
success_msg += f" Name: {template.metadata.get('name', agent_id)}\n"
|
|
1146
|
+
success_msg += (
|
|
1147
|
+
f" Model: {template.capabilities.get('model', 'unknown')}\n"
|
|
1148
|
+
)
|
|
1149
|
+
success_msg += f" Version: {template.agent_version}\n"
|
|
1150
|
+
success_msg += f" Tier: {template.tier}\n"
|
|
1151
|
+
|
|
1152
|
+
if template.parent_agent:
|
|
1153
|
+
success_msg += f" Inherits: {template.parent_agent}\n"
|
|
1154
|
+
|
|
1155
|
+
return CommandResult.success_result(success_msg)
|
|
1156
|
+
|
|
1157
|
+
except Exception as e:
|
|
1158
|
+
return CommandResult.error_result(f"Local agent test failed: {e}")
|
|
1159
|
+
|
|
1160
|
+
def _delete_local_agents(self, args) -> CommandResult:
|
|
1161
|
+
"""Delete local agent templates with comprehensive options."""
|
|
1162
|
+
try:
|
|
1163
|
+
from ...services.agents.local_template_manager import (
|
|
1164
|
+
LocalAgentTemplateManager,
|
|
1165
|
+
)
|
|
1166
|
+
|
|
1167
|
+
manager = LocalAgentTemplateManager()
|
|
1168
|
+
|
|
1169
|
+
# Get command arguments
|
|
1170
|
+
agent_ids = getattr(args, "agent_id", [])
|
|
1171
|
+
delete_all = getattr(args, "all", False)
|
|
1172
|
+
tier = getattr(args, "tier", "project")
|
|
1173
|
+
force = getattr(args, "force", False)
|
|
1174
|
+
keep_deployment = getattr(args, "keep_deployment", False)
|
|
1175
|
+
backup = getattr(args, "backup", False)
|
|
1176
|
+
|
|
1177
|
+
# Validate arguments
|
|
1178
|
+
if not agent_ids and not delete_all:
|
|
1179
|
+
return CommandResult.error_result(
|
|
1180
|
+
"Either --agent-id or --all must be specified"
|
|
1181
|
+
)
|
|
1182
|
+
|
|
1183
|
+
if delete_all and agent_ids:
|
|
1184
|
+
return CommandResult.error_result(
|
|
1185
|
+
"Cannot use both --agent-id and --all together"
|
|
1186
|
+
)
|
|
1187
|
+
|
|
1188
|
+
# Get agents to delete
|
|
1189
|
+
if delete_all:
|
|
1190
|
+
# Get all local agents for the specified tier
|
|
1191
|
+
templates = manager.list_local_templates(
|
|
1192
|
+
tier=None if tier == "all" else tier
|
|
1193
|
+
)
|
|
1194
|
+
if not templates:
|
|
1195
|
+
return CommandResult.success_result(
|
|
1196
|
+
f"No local agents found in {tier} tier(s)"
|
|
1197
|
+
)
|
|
1198
|
+
agent_ids = [t.agent_id for t in templates]
|
|
1199
|
+
|
|
1200
|
+
# Strong confirmation for --all
|
|
1201
|
+
if not force:
|
|
1202
|
+
print(
|
|
1203
|
+
f"\n⚠️ WARNING: This will delete ALL {len(agent_ids)} local agents in {tier} tier(s)!"
|
|
1204
|
+
)
|
|
1205
|
+
print("\nAgents to be deleted:")
|
|
1206
|
+
for agent_id in agent_ids:
|
|
1207
|
+
print(f" - {agent_id}")
|
|
1208
|
+
|
|
1209
|
+
confirm = input("\nType 'DELETE ALL' to confirm: ").strip()
|
|
1210
|
+
if confirm != "DELETE ALL":
|
|
1211
|
+
return CommandResult.error_result("Deletion cancelled")
|
|
1212
|
+
else:
|
|
1213
|
+
# Validate that agents exist
|
|
1214
|
+
missing_agents = []
|
|
1215
|
+
for agent_id in agent_ids:
|
|
1216
|
+
template = manager.get_local_template(agent_id)
|
|
1217
|
+
if not template:
|
|
1218
|
+
missing_agents.append(agent_id)
|
|
1219
|
+
|
|
1220
|
+
if missing_agents:
|
|
1221
|
+
return CommandResult.error_result(
|
|
1222
|
+
f"Agent(s) not found: {', '.join(missing_agents)}"
|
|
1223
|
+
)
|
|
1224
|
+
|
|
1225
|
+
# Confirmation for multiple agents
|
|
1226
|
+
if len(agent_ids) > 1 and not force:
|
|
1227
|
+
print(f"\n⚠️ This will delete {len(agent_ids)} agents:")
|
|
1228
|
+
for agent_id in agent_ids:
|
|
1229
|
+
print(f" - {agent_id}")
|
|
1230
|
+
|
|
1231
|
+
confirm = input("\nAre you sure? [y/N]: ").strip().lower()
|
|
1232
|
+
if confirm not in ["y", "yes"]:
|
|
1233
|
+
return CommandResult.error_result("Deletion cancelled")
|
|
1234
|
+
|
|
1235
|
+
# Confirmation for single agent
|
|
1236
|
+
elif len(agent_ids) == 1 and not force:
|
|
1237
|
+
template = manager.get_local_template(agent_ids[0])
|
|
1238
|
+
print("\n📋 Agent to delete:")
|
|
1239
|
+
print(f" ID: {template.agent_id}")
|
|
1240
|
+
print(f" Name: {template.metadata.get('name', template.agent_id)}")
|
|
1241
|
+
print(f" Tier: {template.tier}")
|
|
1242
|
+
|
|
1243
|
+
confirm = input("\nAre you sure? [y/N]: ").strip().lower()
|
|
1244
|
+
if confirm not in ["y", "yes"]:
|
|
1245
|
+
return CommandResult.error_result("Deletion cancelled")
|
|
1246
|
+
|
|
1247
|
+
# Perform deletion
|
|
1248
|
+
if len(agent_ids) == 1:
|
|
1249
|
+
# Single deletion
|
|
1250
|
+
result = manager.delete_local_template(
|
|
1251
|
+
agent_id=agent_ids[0],
|
|
1252
|
+
tier=tier,
|
|
1253
|
+
delete_deployment=not keep_deployment,
|
|
1254
|
+
backup_first=backup,
|
|
1255
|
+
)
|
|
1256
|
+
|
|
1257
|
+
if result["success"]:
|
|
1258
|
+
message = f"✅ Successfully deleted agent '{agent_ids[0]}'"
|
|
1259
|
+
if result["backup_location"]:
|
|
1260
|
+
message += f"\n Backup saved to: {result['backup_location']}"
|
|
1261
|
+
message += f"\n Removed {len(result['deleted_files'])} file(s)"
|
|
1262
|
+
return CommandResult.success_result(message)
|
|
1263
|
+
errors = "\n".join(result["errors"])
|
|
1264
|
+
return CommandResult.error_result(
|
|
1265
|
+
f"Failed to delete agent '{agent_ids[0]}':\n{errors}"
|
|
1266
|
+
)
|
|
1267
|
+
# Multiple deletion
|
|
1268
|
+
results = manager.delete_multiple_templates(
|
|
1269
|
+
agent_ids=agent_ids,
|
|
1270
|
+
tier=tier,
|
|
1271
|
+
delete_deployment=not keep_deployment,
|
|
1272
|
+
backup_first=backup,
|
|
1273
|
+
)
|
|
1274
|
+
|
|
1275
|
+
# Format results
|
|
1276
|
+
message = ""
|
|
1277
|
+
if results["successful"]:
|
|
1278
|
+
message = (
|
|
1279
|
+
f"✅ Successfully deleted {len(results['successful'])} agent(s):\n"
|
|
1280
|
+
)
|
|
1281
|
+
for agent_id in results["successful"]:
|
|
1282
|
+
message += f" - {agent_id}\n"
|
|
1283
|
+
|
|
1284
|
+
if results["failed"]:
|
|
1285
|
+
if message:
|
|
1286
|
+
message += "\n"
|
|
1287
|
+
message += f"❌ Failed to delete {len(results['failed'])} agent(s):\n"
|
|
1288
|
+
for agent_id in results["failed"]:
|
|
1289
|
+
errors = results["details"][agent_id]["errors"]
|
|
1290
|
+
message += f" - {agent_id}: {', '.join(errors)}\n"
|
|
1291
|
+
|
|
1292
|
+
if not message:
|
|
1293
|
+
message = "No agents were deleted"
|
|
1294
|
+
|
|
1295
|
+
return (
|
|
1296
|
+
CommandResult.success_result(message.strip())
|
|
1297
|
+
if results["successful"]
|
|
1298
|
+
else CommandResult.error_result(message.strip())
|
|
1299
|
+
)
|
|
1300
|
+
|
|
1301
|
+
except Exception as e:
|
|
1302
|
+
return CommandResult.error_result(f"Failed to delete local agents: {e}")
|
|
1303
|
+
|
|
1304
|
+
def _show_help(self) -> CommandResult:
|
|
1305
|
+
"""Show help for agent manager."""
|
|
1306
|
+
help_text = """
|
|
1307
|
+
Agent Manager - Comprehensive Agent Lifecycle Management
|
|
1308
|
+
|
|
1309
|
+
Interactive Commands (Recommended):
|
|
1310
|
+
create-interactive 🧙♂️ Launch step-by-step agent creation wizard
|
|
1311
|
+
manage-local 🔧 Interactive menu for managing local agents
|
|
1312
|
+
edit-interactive ✏️ Edit agent configuration interactively
|
|
1313
|
+
test-local 🧪 Test local agent with validation and deployment
|
|
1314
|
+
|
|
1315
|
+
Standard Commands:
|
|
1316
|
+
list List all agents across tiers with hierarchy
|
|
1317
|
+
create Create a new agent (interactive or with arguments)
|
|
1318
|
+
variant Create an agent variant based on existing agent
|
|
1319
|
+
deploy Deploy agent to project or user tier
|
|
1320
|
+
customize-pm Customize PM instructions via .claude-mpm/INSTRUCTIONS.md
|
|
1321
|
+
show Display detailed agent information
|
|
1322
|
+
test Validate agent configuration
|
|
1323
|
+
templates List available agent templates
|
|
1324
|
+
reset Remove claude-mpm authored agents for clean install
|
|
1325
|
+
|
|
1326
|
+
Local Agent Commands:
|
|
1327
|
+
create-local Create a local JSON agent template in .claude-mpm/agents/
|
|
1328
|
+
deploy-local Deploy local JSON templates to Claude Code
|
|
1329
|
+
list-local List all local agent templates
|
|
1330
|
+
sync-local Synchronize local templates with deployed agents
|
|
1331
|
+
export-local Export local templates to a directory
|
|
1332
|
+
import-local Import templates from a directory
|
|
1333
|
+
delete-local Delete local agent templates with safety checks
|
|
1334
|
+
|
|
1335
|
+
Interactive Examples:
|
|
1336
|
+
claude-mpm agent-manager create-interactive
|
|
1337
|
+
claude-mpm agent-manager manage-local
|
|
1338
|
+
claude-mpm agent-manager edit-interactive --agent-id my-agent
|
|
1339
|
+
claude-mpm agent-manager test-local --agent-id my-agent
|
|
1340
|
+
|
|
1341
|
+
Standard Examples:
|
|
1342
|
+
claude-mpm agent-manager list
|
|
1343
|
+
claude-mpm agent-manager create --id my-agent --name "My Agent"
|
|
1344
|
+
claude-mpm agent-manager variant --base research --id research-v2
|
|
1345
|
+
claude-mpm agent-manager deploy --agent-id my-agent --tier user
|
|
1346
|
+
claude-mpm agent-manager customize-pm --level project
|
|
1347
|
+
claude-mpm agent-manager reset --dry-run
|
|
1348
|
+
claude-mpm agent-manager reset --force --project-only
|
|
1349
|
+
|
|
1350
|
+
Local Agent Examples:
|
|
1351
|
+
claude-mpm agent-manager create-local --agent-id custom-research --name "Custom Research"
|
|
1352
|
+
claude-mpm agent-manager deploy-local --agent-id custom-research
|
|
1353
|
+
claude-mpm agent-manager list-local --tier project
|
|
1354
|
+
claude-mpm agent-manager sync-local
|
|
1355
|
+
claude-mpm agent-manager export-local --output ./my-agents
|
|
1356
|
+
claude-mpm agent-manager import-local --input ./shared-agents --tier user
|
|
1357
|
+
claude-mpm agent-manager delete-local --agent-id custom-qa
|
|
1358
|
+
claude-mpm agent-manager delete-local --agent-id qa research --force
|
|
1359
|
+
claude-mpm agent-manager delete-local --all --tier project --backup
|
|
1360
|
+
|
|
1361
|
+
Interactive Features:
|
|
1362
|
+
✨ Step-by-step guided agent creation
|
|
1363
|
+
🎯 Intelligent defaults and suggestions
|
|
1364
|
+
🔍 Real-time validation with helpful errors
|
|
1365
|
+
👁️ Preview configurations before creation
|
|
1366
|
+
🏗️ Inherit from existing system agents
|
|
1367
|
+
📝 Management menu for all local agents
|
|
1368
|
+
🚀 One-click deployment and testing
|
|
1369
|
+
|
|
1370
|
+
Notes:
|
|
1371
|
+
• Interactive mode provides the best user experience
|
|
1372
|
+
• PM customization writes to .claude-mpm/INSTRUCTIONS.md, not CLAUDE.md
|
|
1373
|
+
• Local agents are stored as JSON templates in .claude-mpm/agents/
|
|
1374
|
+
• Local project agents override system agents with the same name
|
|
1375
|
+
• Project name is used as the "author" field for local agents
|
|
1376
|
+
"""
|
|
1377
|
+
return CommandResult.success_result(help_text)
|
|
1378
|
+
|
|
1379
|
+
|
|
1380
|
+
# Module-level function for CLI integration
|
|
1381
|
+
def manage_agent_manager(args) -> int:
|
|
1382
|
+
"""Entry point for agent-manager command from CLI.
|
|
1383
|
+
|
|
1384
|
+
Args:
|
|
1385
|
+
args: Parsed command line arguments
|
|
1386
|
+
|
|
1387
|
+
Returns:
|
|
1388
|
+
Exit code (0 for success, non-zero for failure)
|
|
1389
|
+
"""
|
|
1390
|
+
command = AgentManagerCommand()
|
|
1391
|
+
result = command.run(args)
|
|
1392
|
+
|
|
1393
|
+
if result.success:
|
|
1394
|
+
# Handle JSON output format
|
|
1395
|
+
output_format = getattr(args, "format", OutputFormat.TEXT)
|
|
1396
|
+
if str(output_format).lower() == OutputFormat.JSON and result.data is not None:
|
|
1397
|
+
print(json.dumps(result.data, indent=2))
|
|
1398
|
+
elif result.message:
|
|
1399
|
+
print(result.message)
|
|
1400
|
+
return 0
|
|
1401
|
+
if result.message:
|
|
1402
|
+
print(f"Error: {result.message}", file=sys.stderr)
|
|
1403
|
+
return 1
|