claude-mpm 4.1.6__py3-none-any.whl ā 4.24.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +431 -214
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/MEMORY.md +3 -0
- claude_mpm/agents/OUTPUT_STYLE.md +335 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
- claude_mpm/agents/WORKFLOW.md +355 -187
- claude_mpm/agents/agent_loader.py +40 -10
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/agents_metadata.py +57 -0
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent_loader.py +11 -9
- claude_mpm/agents/frontmatter_validator.py +291 -251
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +17 -0
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +267 -18
- claude_mpm/agents/templates/agentic-coder-optimizer.json +248 -0
- claude_mpm/agents/templates/api_qa.json +16 -4
- claude_mpm/agents/templates/circuit_breakers.md +638 -0
- claude_mpm/agents/templates/clerk-ops.json +235 -0
- claude_mpm/agents/templates/code_analyzer.json +25 -9
- claude_mpm/agents/templates/content-agent.json +358 -0
- claude_mpm/agents/templates/dart_engineer.json +307 -0
- claude_mpm/agents/templates/data_engineer.json +87 -14
- claude_mpm/agents/templates/documentation.json +76 -13
- claude_mpm/agents/templates/engineer.json +44 -10
- claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
- claude_mpm/agents/templates/git_file_tracking.md +584 -0
- claude_mpm/agents/templates/golang_engineer.json +270 -0
- claude_mpm/agents/templates/imagemagick.json +5 -2
- claude_mpm/agents/templates/java_engineer.json +346 -0
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/local_ops_agent.json +1840 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +39 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
- claude_mpm/agents/templates/memory_manager.json +6 -3
- claude_mpm/agents/templates/nextjs_engineer.json +285 -0
- claude_mpm/agents/templates/ops.json +27 -8
- claude_mpm/agents/templates/php-engineer.json +287 -0
- claude_mpm/agents/templates/pm_examples.md +474 -0
- claude_mpm/agents/templates/pm_red_flags.md +262 -0
- claude_mpm/agents/templates/product_owner.json +338 -0
- claude_mpm/agents/templates/project_organizer.json +19 -5
- claude_mpm/agents/templates/prompt-engineer.json +737 -0
- claude_mpm/agents/templates/python_engineer.json +387 -0
- claude_mpm/agents/templates/qa.json +26 -6
- claude_mpm/agents/templates/react_engineer.json +239 -0
- claude_mpm/agents/templates/refactoring_engineer.json +15 -5
- claude_mpm/agents/templates/research.json +47 -22
- claude_mpm/agents/templates/response_format.md +583 -0
- claude_mpm/agents/templates/ruby-engineer.json +280 -0
- claude_mpm/agents/templates/rust_engineer.json +275 -0
- claude_mpm/agents/templates/security.json +59 -10
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +16 -7
- claude_mpm/agents/templates/typescript_engineer.json +285 -0
- claude_mpm/agents/templates/validation_templates.md +312 -0
- claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
- claude_mpm/agents/templates/version_control.json +16 -4
- claude_mpm/agents/templates/web_qa.json +243 -21
- claude_mpm/agents/templates/web_ui.json +18 -5
- claude_mpm/cli/__init__.py +38 -363
- claude_mpm/cli/commands/__init__.py +8 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +722 -150
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +10 -6
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +570 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +488 -884
- claude_mpm/cli/commands/configure_agent_display.py +261 -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 +167 -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 +43 -7
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +537 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +168 -617
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +525 -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/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -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/run.py +169 -42
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skills.py +488 -0
- 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 +204 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +962 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agents_parser.py +116 -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 +245 -0
- claude_mpm/cli/parsers/base_parser.py +187 -3
- claude_mpm/cli/parsers/configure_parser.py +34 -15
- 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 +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +562 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +53 -2
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +122 -0
- claude_mpm/commands/mpm-auto-configure.md +269 -0
- claude_mpm/commands/mpm-config.md +141 -0
- claude_mpm/commands/mpm-doctor.md +24 -0
- claude_mpm/commands/mpm-help.md +290 -0
- claude_mpm/commands/mpm-init.md +521 -0
- claude_mpm/commands/mpm-monitor.md +409 -0
- claude_mpm/commands/mpm-organize.md +295 -0
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-status.md +75 -0
- claude_mpm/commands/mpm-tickets.md +151 -0
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +21 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/socketio_config.py +36 -7
- claude_mpm/constants.py +27 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +19 -8
- claude_mpm/core/config.py +103 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +65 -0
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +38 -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 +288 -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 +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +223 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +161 -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 +323 -1491
- claude_mpm/core/hook_manager.py +8 -6
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +55 -8
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +100 -28
- claude_mpm/core/logger.py +19 -14
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +51 -7
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +118 -15
- claude_mpm/core/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +116 -12
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/analysis_runner.py +455 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
- claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
- claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
- claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
- claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
- claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
- claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
- claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
- claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
- claude_mpm/dashboard/static/built/components/code-tree.js +2 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
- claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
- claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/built/connection-manager.js +536 -0
- claude_mpm/dashboard/static/built/dashboard.js +1 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/built/react/events.js +30 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
- claude_mpm/dashboard/static/built/shared/logger.js +385 -0
- claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/built/socket-client.js +1 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/css/activity.css +1958 -0
- claude_mpm/dashboard/static/css/dashboard.css +1413 -72
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
- claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/react/events.js +30 -0
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/events.html +607 -0
- claude_mpm/dashboard/static/index.html +635 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +1871 -0
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
- claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
- claude_mpm/dashboard/static/js/components/build-tracker.js +23 -13
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -107
- claude_mpm/dashboard/static/js/components/event-viewer.js +98 -11
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +68 -205
- claude_mpm/dashboard/static/js/components/session-manager.js +46 -10
- claude_mpm/dashboard/static/js/components/socket-manager.js +16 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +359 -40
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1824 -0
- claude_mpm/dashboard/static/js/components/working-directory.js +61 -10
- claude_mpm/dashboard/static/js/connection-manager.js +1 -1
- claude_mpm/dashboard/static/js/dashboard.js +523 -622
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/js/shared/logger.js +385 -0
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/js/socket-client.js +549 -62
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/legacy/activity.html +736 -0
- claude_mpm/dashboard/static/legacy/agents.html +786 -0
- claude_mpm/dashboard/static/legacy/files.html +747 -0
- claude_mpm/dashboard/static/legacy/tools.html +831 -0
- claude_mpm/dashboard/static/monitors.html +431 -0
- claude_mpm/dashboard/static/production/events.html +659 -0
- claude_mpm/dashboard/static/production/main.html +698 -0
- claude_mpm/dashboard/static/production/monitors.html +483 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
- claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
- claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
- claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +267 -9
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +4 -2
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
- claude_mpm/hooks/claude_hooks/hook_handler.py +209 -25
- claude_mpm/hooks/claude_hooks/installer.py +783 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +64 -49
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +60 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -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 +183 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- 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 +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/claude-hook-handler.sh +187 -0
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +156 -396
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +13 -11
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +127 -27
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
- claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +5 -6
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +722 -37
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +9 -1
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
- claude_mpm/services/agents/local_template_manager.py +744 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +7 -7
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- claude_mpm/services/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +6 -5
- claude_mpm/services/cli/agent_dependency_service.py +1 -1
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +6 -5
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- 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 +13 -21
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +17 -9
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/cache_manager.py +1 -3
- claude_mpm/services/core/interfaces/__init__.py +90 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +172 -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/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +79 -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 +37 -18
- claude_mpm/services/core/service_container.py +2 -2
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +4 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +22 -24
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +152 -13
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +12 -12
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/monitoring.py +12 -12
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +165 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -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 +430 -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 +1612 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +729 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- 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 +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +671 -0
- claude_mpm/services/monitor/daemon_manager.py +963 -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 +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +2 -2
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +6 -6
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +8 -8
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +553 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +3 -3
- claude_mpm/services/project/metrics_collector.py +7 -10
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +581 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +7 -5
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +74 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -0
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +21 -40
- claude_mpm/services/socketio/handlers/connection_handler.py +16 -28
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +8 -8
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +131 -68
- claude_mpm/services/socketio/server/core.py +275 -22
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +99 -29
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +2 -2
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- 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 +903 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -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 +475 -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 +470 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +8 -4
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/__init__.py +19 -0
- claude_mpm/services/visualization/mermaid_generator.py +938 -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/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/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/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/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 +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -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/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 +310 -0
- claude_mpm/skills/skills_registry.py +348 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- 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/agent_dependency_loader.py +108 -27
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +2 -2
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/robust_installer.py +133 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-4.24.0.dist-info/METADATA +675 -0
- claude_mpm-4.24.0.dist-info/RECORD +1018 -0
- {claude_mpm-4.1.6.dist-info ā claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -237
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/agent-manager.md +0 -304
- claude_mpm/cli/commands/configure_tui.py +0 -1921
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -424
- claude_mpm/services/cli/socketio_manager.py +0 -498
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm-4.1.6.dist-info/METADATA +0 -325
- claude_mpm-4.1.6.dist-info/RECORD +0 -550
- {claude_mpm-4.1.6.dist-info ā claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.6.dist-info ā claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.6.dist-info ā claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
|
@@ -12,8 +12,10 @@ DESIGN DECISIONS:
|
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
14
|
import json
|
|
15
|
+
from pathlib import Path
|
|
15
16
|
|
|
16
17
|
from ...constants import AgentCommands
|
|
18
|
+
from ...core.enums import OutputFormat
|
|
17
19
|
from ...services.cli.agent_cleanup_service import AgentCleanupService
|
|
18
20
|
from ...services.cli.agent_dependency_service import AgentDependencyService
|
|
19
21
|
from ...services.cli.agent_listing_service import AgentListingService
|
|
@@ -26,6 +28,14 @@ from ..shared import (
|
|
|
26
28
|
from ..utils import get_agent_versions_display
|
|
27
29
|
|
|
28
30
|
|
|
31
|
+
def _is_structured_output(args) -> bool:
|
|
32
|
+
"""Check if args specify structured output format (JSON/YAML)."""
|
|
33
|
+
if hasattr(args, "format"):
|
|
34
|
+
fmt = str(args.format).lower()
|
|
35
|
+
return fmt in (OutputFormat.JSON, OutputFormat.YAML)
|
|
36
|
+
return False
|
|
37
|
+
|
|
38
|
+
|
|
29
39
|
class AgentsCommand(AgentCommand):
|
|
30
40
|
"""Agent management command using shared utilities."""
|
|
31
41
|
|
|
@@ -50,8 +60,8 @@ class AgentsCommand(AgentCommand):
|
|
|
50
60
|
|
|
51
61
|
base_service = AgentDeploymentService()
|
|
52
62
|
self._deployment_service = DeploymentServiceWrapper(base_service)
|
|
53
|
-
except ImportError:
|
|
54
|
-
raise ImportError("Agent deployment service not available")
|
|
63
|
+
except ImportError as e:
|
|
64
|
+
raise ImportError("Agent deployment service not available") from e
|
|
55
65
|
return self._deployment_service
|
|
56
66
|
|
|
57
67
|
@property
|
|
@@ -86,6 +96,31 @@ class AgentsCommand(AgentCommand):
|
|
|
86
96
|
)
|
|
87
97
|
return self._cleanup_service
|
|
88
98
|
|
|
99
|
+
def _get_output_format(self, args) -> str:
|
|
100
|
+
"""
|
|
101
|
+
Get output format from args with enum default.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
args: Command arguments
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
Output format string (compatible with both enum and string usage)
|
|
108
|
+
"""
|
|
109
|
+
return getattr(args, "format", OutputFormat.TEXT)
|
|
110
|
+
|
|
111
|
+
def _is_structured_format(self, format_str: str) -> bool:
|
|
112
|
+
"""
|
|
113
|
+
Check if format is structured (JSON/YAML).
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
format_str: Format string to check
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
True if format is JSON or YAML
|
|
120
|
+
"""
|
|
121
|
+
fmt = str(format_str).lower()
|
|
122
|
+
return fmt in (OutputFormat.JSON, OutputFormat.YAML)
|
|
123
|
+
|
|
89
124
|
def validate_args(self, args) -> str:
|
|
90
125
|
"""Validate command arguments."""
|
|
91
126
|
# Most agent commands are optional, so basic validation
|
|
@@ -115,6 +150,15 @@ class AgentsCommand(AgentCommand):
|
|
|
115
150
|
"deps-list": self._list_agent_dependencies,
|
|
116
151
|
"deps-fix": self._fix_agent_dependencies,
|
|
117
152
|
"cleanup-orphaned": self._cleanup_orphaned_agents,
|
|
153
|
+
# Local agent management commands
|
|
154
|
+
"create": self._create_local_agent,
|
|
155
|
+
"edit": self._edit_local_agent,
|
|
156
|
+
"delete": self._delete_local_agent,
|
|
157
|
+
"manage": self._manage_local_agents,
|
|
158
|
+
"configure": self._configure_deployment,
|
|
159
|
+
# Auto-configuration commands (TSK-0054 Phase 5)
|
|
160
|
+
"detect": self._detect_toolchain,
|
|
161
|
+
"recommend": self._recommend_agents,
|
|
118
162
|
}
|
|
119
163
|
|
|
120
164
|
if args.agents_command in command_map:
|
|
@@ -135,14 +179,14 @@ class AgentsCommand(AgentCommand):
|
|
|
135
179
|
try:
|
|
136
180
|
agent_versions = get_agent_versions_display()
|
|
137
181
|
|
|
138
|
-
output_format =
|
|
139
|
-
if output_format
|
|
182
|
+
output_format = self._get_output_format(args)
|
|
183
|
+
if self._is_structured_format(output_format):
|
|
140
184
|
# Parse the agent versions display into structured data
|
|
141
185
|
if agent_versions:
|
|
142
186
|
data = {"agent_versions": agent_versions, "has_agents": True}
|
|
143
187
|
formatted = (
|
|
144
188
|
self._formatter.format_as_json(data)
|
|
145
|
-
if output_format ==
|
|
189
|
+
if str(output_format).lower() == OutputFormat.JSON
|
|
146
190
|
else self._formatter.format_as_yaml(data)
|
|
147
191
|
)
|
|
148
192
|
print(formatted)
|
|
@@ -156,7 +200,7 @@ class AgentsCommand(AgentCommand):
|
|
|
156
200
|
}
|
|
157
201
|
formatted = (
|
|
158
202
|
self._formatter.format_as_json(data)
|
|
159
|
-
if output_format ==
|
|
203
|
+
if str(output_format).lower() == OutputFormat.JSON
|
|
160
204
|
else self._formatter.format_as_yaml(data)
|
|
161
205
|
)
|
|
162
206
|
print(formatted)
|
|
@@ -178,7 +222,7 @@ class AgentsCommand(AgentCommand):
|
|
|
178
222
|
def _list_agents(self, args) -> CommandResult:
|
|
179
223
|
"""List available or deployed agents."""
|
|
180
224
|
try:
|
|
181
|
-
output_format =
|
|
225
|
+
output_format = self._get_output_format(args)
|
|
182
226
|
|
|
183
227
|
if hasattr(args, "by_tier") and args.by_tier:
|
|
184
228
|
return self._list_agents_by_tier(args)
|
|
@@ -189,7 +233,7 @@ class AgentsCommand(AgentCommand):
|
|
|
189
233
|
# Default: show usage
|
|
190
234
|
usage_msg = "Use --system to list system agents, --deployed to list deployed agents, or --by-tier to group by precedence"
|
|
191
235
|
|
|
192
|
-
if output_format
|
|
236
|
+
if self._is_structured_format(output_format):
|
|
193
237
|
return CommandResult.error_result(
|
|
194
238
|
"No list option specified",
|
|
195
239
|
data={
|
|
@@ -210,7 +254,7 @@ class AgentsCommand(AgentCommand):
|
|
|
210
254
|
verbose = getattr(args, "verbose", False)
|
|
211
255
|
agents = self.listing_service.list_system_agents(verbose=verbose)
|
|
212
256
|
|
|
213
|
-
output_format =
|
|
257
|
+
output_format = self._get_output_format(args)
|
|
214
258
|
quiet = getattr(args, "quiet", False)
|
|
215
259
|
|
|
216
260
|
# Convert AgentInfo objects to dicts for formatter
|
|
@@ -219,6 +263,7 @@ class AgentsCommand(AgentCommand):
|
|
|
219
263
|
"name": agent.name,
|
|
220
264
|
"type": agent.type,
|
|
221
265
|
"path": agent.path,
|
|
266
|
+
"file": Path(agent.path).name if agent.path else "Unknown",
|
|
222
267
|
"description": agent.description,
|
|
223
268
|
"specializations": agent.specializations,
|
|
224
269
|
"version": agent.version,
|
|
@@ -248,7 +293,7 @@ class AgentsCommand(AgentCommand):
|
|
|
248
293
|
verbose=verbose
|
|
249
294
|
)
|
|
250
295
|
|
|
251
|
-
output_format =
|
|
296
|
+
output_format = self._get_output_format(args)
|
|
252
297
|
quiet = getattr(args, "quiet", False)
|
|
253
298
|
|
|
254
299
|
# Convert AgentInfo objects to dicts for formatter
|
|
@@ -258,6 +303,7 @@ class AgentsCommand(AgentCommand):
|
|
|
258
303
|
"type": agent.type,
|
|
259
304
|
"tier": agent.tier,
|
|
260
305
|
"path": agent.path,
|
|
306
|
+
"file": Path(agent.path).name if agent.path else "Unknown",
|
|
261
307
|
"description": agent.description,
|
|
262
308
|
"specializations": agent.specializations,
|
|
263
309
|
"version": agent.version,
|
|
@@ -272,7 +318,7 @@ class AgentsCommand(AgentCommand):
|
|
|
272
318
|
print(formatted)
|
|
273
319
|
|
|
274
320
|
# Add warnings for text output
|
|
275
|
-
if output_format ==
|
|
321
|
+
if str(output_format).lower() == OutputFormat.TEXT and warnings:
|
|
276
322
|
print("\nWarnings:")
|
|
277
323
|
for warning in warnings:
|
|
278
324
|
print(f" ā ļø {warning}")
|
|
@@ -294,7 +340,7 @@ class AgentsCommand(AgentCommand):
|
|
|
294
340
|
"""List agents grouped by tier/precedence."""
|
|
295
341
|
try:
|
|
296
342
|
tier_info = self.listing_service.list_agents_by_tier()
|
|
297
|
-
output_format =
|
|
343
|
+
output_format = self._get_output_format(args)
|
|
298
344
|
|
|
299
345
|
# Convert to format expected by formatter
|
|
300
346
|
agents_by_tier = {
|
|
@@ -377,7 +423,7 @@ class AgentsCommand(AgentCommand):
|
|
|
377
423
|
or project_result.get("target_dir"),
|
|
378
424
|
}
|
|
379
425
|
|
|
380
|
-
output_format =
|
|
426
|
+
output_format = self._get_output_format(args)
|
|
381
427
|
verbose = getattr(args, "verbose", False)
|
|
382
428
|
|
|
383
429
|
formatted = self._formatter.format_deployment_result(
|
|
@@ -403,7 +449,7 @@ class AgentsCommand(AgentCommand):
|
|
|
403
449
|
try:
|
|
404
450
|
result = self.cleanup_service.clean_deployed_agents()
|
|
405
451
|
|
|
406
|
-
output_format =
|
|
452
|
+
output_format = self._get_output_format(args)
|
|
407
453
|
dry_run = False # Regular clean is not a dry run
|
|
408
454
|
|
|
409
455
|
formatted = self._formatter.format_cleanup_result(
|
|
@@ -441,7 +487,7 @@ class AgentsCommand(AgentCommand):
|
|
|
441
487
|
f"Could not retrieve details for agent '{agent_name}'"
|
|
442
488
|
)
|
|
443
489
|
|
|
444
|
-
output_format =
|
|
490
|
+
output_format = self._get_output_format(args)
|
|
445
491
|
verbose = getattr(args, "verbose", False)
|
|
446
492
|
|
|
447
493
|
formatted = self._formatter.format_agent_details(
|
|
@@ -463,148 +509,170 @@ class AgentsCommand(AgentCommand):
|
|
|
463
509
|
dry_run = getattr(args, "dry_run", False)
|
|
464
510
|
agent_name = getattr(args, "agent_name", None)
|
|
465
511
|
fix_all = getattr(args, "all", False)
|
|
512
|
+
output_format = self._get_output_format(args)
|
|
466
513
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
# Determine what to fix
|
|
514
|
+
# Route to appropriate handler based on input
|
|
470
515
|
if fix_all:
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
formatted = (
|
|
476
|
-
self._formatter.format_as_json(result)
|
|
477
|
-
if output_format == "json"
|
|
478
|
-
else self._formatter.format_as_yaml(result)
|
|
479
|
-
)
|
|
480
|
-
print(formatted)
|
|
481
|
-
else:
|
|
482
|
-
# Text output
|
|
483
|
-
mode = "DRY RUN" if dry_run else "FIX"
|
|
484
|
-
print(
|
|
485
|
-
f"\nš§ {mode}: Checking {result.get('total_agents', 0)} agent(s) for frontmatter issues...\n"
|
|
486
|
-
)
|
|
487
|
-
|
|
488
|
-
if result.get("results"):
|
|
489
|
-
for agent_result in result["results"]:
|
|
490
|
-
print(f"š {agent_result['agent']}:")
|
|
491
|
-
if agent_result.get("skipped"):
|
|
492
|
-
print(
|
|
493
|
-
f" ā ļø Skipped: {agent_result.get('reason', 'Unknown reason')}"
|
|
494
|
-
)
|
|
495
|
-
elif agent_result.get("was_valid"):
|
|
496
|
-
print(" ā No issues found")
|
|
497
|
-
else:
|
|
498
|
-
if agent_result.get("errors_found", 0) > 0:
|
|
499
|
-
print(
|
|
500
|
-
f" ā Errors found: {agent_result['errors_found']}"
|
|
501
|
-
)
|
|
502
|
-
if agent_result.get("warnings_found", 0) > 0:
|
|
503
|
-
print(
|
|
504
|
-
f" ā ļø Warnings found: {agent_result['warnings_found']}"
|
|
505
|
-
)
|
|
506
|
-
if dry_run:
|
|
507
|
-
if agent_result.get("corrections_available", 0) > 0:
|
|
508
|
-
print(
|
|
509
|
-
f" š§ Would fix: {agent_result['corrections_available']} issues"
|
|
510
|
-
)
|
|
511
|
-
elif agent_result.get("corrections_made", 0) > 0:
|
|
512
|
-
print(
|
|
513
|
-
f" ā Fixed: {agent_result['corrections_made']} issues"
|
|
514
|
-
)
|
|
515
|
-
print()
|
|
516
|
-
|
|
517
|
-
# Summary
|
|
518
|
-
print("=" * 80)
|
|
519
|
-
print("SUMMARY:")
|
|
520
|
-
print(f" Agents checked: {result.get('agents_checked', 0)}")
|
|
521
|
-
print(
|
|
522
|
-
f" Total issues found: {result.get('total_issues_found', 0)}"
|
|
523
|
-
)
|
|
524
|
-
if dry_run:
|
|
525
|
-
print(
|
|
526
|
-
f" Issues that would be fixed: {result.get('total_corrections_available', 0)}"
|
|
527
|
-
)
|
|
528
|
-
print("\nš” Run without --dry-run to apply fixes")
|
|
529
|
-
else:
|
|
530
|
-
print(
|
|
531
|
-
f" Issues fixed: {result.get('total_corrections_made', 0)}"
|
|
532
|
-
)
|
|
533
|
-
if result.get("total_corrections_made", 0) > 0:
|
|
534
|
-
print("\nā Frontmatter issues have been fixed!")
|
|
535
|
-
print("=" * 80 + "\n")
|
|
516
|
+
return self._fix_all_agents(dry_run, output_format)
|
|
517
|
+
if agent_name:
|
|
518
|
+
return self._fix_single_agent(agent_name, dry_run, output_format)
|
|
519
|
+
return self._handle_no_agent_specified(output_format)
|
|
536
520
|
|
|
537
|
-
|
|
538
|
-
|
|
521
|
+
except Exception as e:
|
|
522
|
+
self.logger.error(f"Error fixing agents: {e}", exc_info=True)
|
|
523
|
+
return CommandResult.error_result(f"Error fixing agents: {e}")
|
|
539
524
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
agent_name, dry_run=dry_run
|
|
544
|
-
)
|
|
525
|
+
def _fix_all_agents(self, dry_run: bool, output_format: str) -> CommandResult:
|
|
526
|
+
"""Fix all agents' frontmatter issues."""
|
|
527
|
+
result = self.validation_service.fix_all_agents(dry_run=dry_run)
|
|
545
528
|
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
529
|
+
if self._is_structured_format(output_format):
|
|
530
|
+
self._print_structured_output(result, output_format)
|
|
531
|
+
else:
|
|
532
|
+
self._print_all_agents_text_output(result, dry_run)
|
|
550
533
|
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
self._formatter.format_as_json(result)
|
|
554
|
-
if output_format == "json"
|
|
555
|
-
else self._formatter.format_as_yaml(result)
|
|
556
|
-
)
|
|
557
|
-
print(formatted)
|
|
558
|
-
else:
|
|
559
|
-
# Text output
|
|
560
|
-
mode = "DRY RUN" if dry_run else "FIX"
|
|
561
|
-
print(
|
|
562
|
-
f"\nš§ {mode}: Checking agent '{agent_name}' for frontmatter issues...\n"
|
|
563
|
-
)
|
|
534
|
+
msg = f"{'Would fix' if dry_run else 'Fixed'} {result.get('total_corrections_available' if dry_run else 'total_corrections_made', 0)} issues"
|
|
535
|
+
return CommandResult.success_result(msg, data=result)
|
|
564
536
|
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
print(f" - {error}")
|
|
573
|
-
if result.get("warnings_found"):
|
|
574
|
-
print(" ā ļø Warnings:")
|
|
575
|
-
for warning in result["warnings_found"]:
|
|
576
|
-
print(f" - {warning}")
|
|
577
|
-
if dry_run:
|
|
578
|
-
if result.get("corrections_available"):
|
|
579
|
-
print(" š§ Would fix:")
|
|
580
|
-
for correction in result["corrections_available"]:
|
|
581
|
-
print(f" - {correction}")
|
|
582
|
-
elif result.get("corrections_made"):
|
|
583
|
-
print(" ā Fixed:")
|
|
584
|
-
for correction in result["corrections_made"]:
|
|
585
|
-
print(f" - {correction}")
|
|
586
|
-
print()
|
|
537
|
+
def _fix_single_agent(
|
|
538
|
+
self, agent_name: str, dry_run: bool, output_format: str
|
|
539
|
+
) -> CommandResult:
|
|
540
|
+
"""Fix a single agent's frontmatter issues."""
|
|
541
|
+
result = self.validation_service.fix_agent_frontmatter(
|
|
542
|
+
agent_name, dry_run=dry_run
|
|
543
|
+
)
|
|
587
544
|
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
545
|
+
if not result.get("success"):
|
|
546
|
+
return CommandResult.error_result(
|
|
547
|
+
result.get("error", "Failed to fix agent")
|
|
548
|
+
)
|
|
592
549
|
|
|
593
|
-
|
|
594
|
-
|
|
550
|
+
if self._is_structured_format(output_format):
|
|
551
|
+
self._print_structured_output(result, output_format)
|
|
552
|
+
else:
|
|
553
|
+
self._print_single_agent_text_output(agent_name, result, dry_run)
|
|
595
554
|
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
if output_format in ["json", "yaml"]:
|
|
599
|
-
return CommandResult.error_result(
|
|
600
|
-
"No agent specified", data={"usage": usage_msg}
|
|
601
|
-
)
|
|
602
|
-
print(f"ā {usage_msg}")
|
|
603
|
-
return CommandResult.error_result("No agent specified")
|
|
555
|
+
msg = f"{'Would fix' if dry_run else 'Fixed'} agent '{agent_name}'"
|
|
556
|
+
return CommandResult.success_result(msg, data=result)
|
|
604
557
|
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
558
|
+
def _handle_no_agent_specified(self, output_format: str) -> CommandResult:
|
|
559
|
+
"""Handle case where no agent is specified."""
|
|
560
|
+
usage_msg = "Please specify an agent name or use --all to fix all agents\nUsage: claude-mpm agents fix [agent_name] [--dry-run] [--all]"
|
|
561
|
+
if self._is_structured_format(output_format):
|
|
562
|
+
return CommandResult.error_result(
|
|
563
|
+
"No agent specified", data={"usage": usage_msg}
|
|
564
|
+
)
|
|
565
|
+
print(f"ā {usage_msg}")
|
|
566
|
+
return CommandResult.error_result("No agent specified")
|
|
567
|
+
|
|
568
|
+
def _print_structured_output(self, result: dict, output_format: str) -> None:
|
|
569
|
+
"""Print result in JSON or YAML format."""
|
|
570
|
+
formatted = (
|
|
571
|
+
self._formatter.format_as_json(result)
|
|
572
|
+
if str(output_format).lower() == OutputFormat.JSON
|
|
573
|
+
else self._formatter.format_as_yaml(result)
|
|
574
|
+
)
|
|
575
|
+
print(formatted)
|
|
576
|
+
|
|
577
|
+
def _print_all_agents_text_output(self, result: dict, dry_run: bool) -> None:
|
|
578
|
+
"""Print text output for all agents fix operation."""
|
|
579
|
+
mode = "DRY RUN" if dry_run else "FIX"
|
|
580
|
+
print(
|
|
581
|
+
f"\nš§ {mode}: Checking {result.get('total_agents', 0)} agent(s) for frontmatter issues...\n"
|
|
582
|
+
)
|
|
583
|
+
|
|
584
|
+
if result.get("results"):
|
|
585
|
+
for agent_result in result["results"]:
|
|
586
|
+
self._print_agent_result(agent_result, dry_run)
|
|
587
|
+
|
|
588
|
+
self._print_all_agents_summary(result, dry_run)
|
|
589
|
+
|
|
590
|
+
def _print_agent_result(self, agent_result: dict, dry_run: bool) -> None:
|
|
591
|
+
"""Print result for a single agent."""
|
|
592
|
+
print(f"š {agent_result['agent']}:")
|
|
593
|
+
if agent_result.get("skipped"):
|
|
594
|
+
print(f" ā ļø Skipped: {agent_result.get('reason', 'Unknown reason')}")
|
|
595
|
+
elif agent_result.get("was_valid"):
|
|
596
|
+
print(" ā No issues found")
|
|
597
|
+
else:
|
|
598
|
+
self._print_agent_issues(agent_result, dry_run)
|
|
599
|
+
print()
|
|
600
|
+
|
|
601
|
+
def _print_agent_issues(self, agent_result: dict, dry_run: bool) -> None:
|
|
602
|
+
"""Print issues found for an agent."""
|
|
603
|
+
if agent_result.get("errors_found", 0) > 0:
|
|
604
|
+
print(f" ā Errors found: {agent_result['errors_found']}")
|
|
605
|
+
if agent_result.get("warnings_found", 0) > 0:
|
|
606
|
+
print(f" ā ļø Warnings found: {agent_result['warnings_found']}")
|
|
607
|
+
|
|
608
|
+
if dry_run:
|
|
609
|
+
if agent_result.get("corrections_available", 0) > 0:
|
|
610
|
+
print(f" š§ Would fix: {agent_result['corrections_available']} issues")
|
|
611
|
+
elif agent_result.get("corrections_made", 0) > 0:
|
|
612
|
+
print(f" ā Fixed: {agent_result['corrections_made']} issues")
|
|
613
|
+
|
|
614
|
+
def _print_all_agents_summary(self, result: dict, dry_run: bool) -> None:
|
|
615
|
+
"""Print summary for all agents fix operation."""
|
|
616
|
+
print("=" * 80)
|
|
617
|
+
print("SUMMARY:")
|
|
618
|
+
print(f" Agents checked: {result.get('agents_checked', 0)}")
|
|
619
|
+
print(f" Total issues found: {result.get('total_issues_found', 0)}")
|
|
620
|
+
|
|
621
|
+
if dry_run:
|
|
622
|
+
print(
|
|
623
|
+
f" Issues that would be fixed: {result.get('total_corrections_available', 0)}"
|
|
624
|
+
)
|
|
625
|
+
print("\nš” Run without --dry-run to apply fixes")
|
|
626
|
+
else:
|
|
627
|
+
print(f" Issues fixed: {result.get('total_corrections_made', 0)}")
|
|
628
|
+
if result.get("total_corrections_made", 0) > 0:
|
|
629
|
+
print("\nā Frontmatter issues have been fixed!")
|
|
630
|
+
print("=" * 80 + "\n")
|
|
631
|
+
|
|
632
|
+
def _print_single_agent_text_output(
|
|
633
|
+
self, agent_name: str, result: dict, dry_run: bool
|
|
634
|
+
) -> None:
|
|
635
|
+
"""Print text output for single agent fix operation."""
|
|
636
|
+
mode = "DRY RUN" if dry_run else "FIX"
|
|
637
|
+
print(f"\nš§ {mode}: Checking agent '{agent_name}' for frontmatter issues...\n")
|
|
638
|
+
|
|
639
|
+
print(f"š {agent_name}:")
|
|
640
|
+
if result.get("was_valid"):
|
|
641
|
+
print(" ā No issues found")
|
|
642
|
+
else:
|
|
643
|
+
self._print_single_agent_issues(result, dry_run)
|
|
644
|
+
print()
|
|
645
|
+
|
|
646
|
+
self._print_single_agent_footer(result, dry_run)
|
|
647
|
+
|
|
648
|
+
def _print_single_agent_issues(self, result: dict, dry_run: bool) -> None:
|
|
649
|
+
"""Print issues for a single agent."""
|
|
650
|
+
if result.get("errors_found"):
|
|
651
|
+
print(" ā Errors:")
|
|
652
|
+
for error in result["errors_found"]:
|
|
653
|
+
print(f" - {error}")
|
|
654
|
+
|
|
655
|
+
if result.get("warnings_found"):
|
|
656
|
+
print(" ā ļø Warnings:")
|
|
657
|
+
for warning in result["warnings_found"]:
|
|
658
|
+
print(f" - {warning}")
|
|
659
|
+
|
|
660
|
+
if dry_run:
|
|
661
|
+
if result.get("corrections_available"):
|
|
662
|
+
print(" š§ Would fix:")
|
|
663
|
+
for correction in result["corrections_available"]:
|
|
664
|
+
print(f" - {correction}")
|
|
665
|
+
elif result.get("corrections_made"):
|
|
666
|
+
print(" ā Fixed:")
|
|
667
|
+
for correction in result["corrections_made"]:
|
|
668
|
+
print(f" - {correction}")
|
|
669
|
+
|
|
670
|
+
def _print_single_agent_footer(self, result: dict, dry_run: bool) -> None:
|
|
671
|
+
"""Print footer message for single agent fix."""
|
|
672
|
+
if dry_run and result.get("corrections_available"):
|
|
673
|
+
print("š” Run without --dry-run to apply fixes\n")
|
|
674
|
+
elif not dry_run and result.get("corrections_made"):
|
|
675
|
+
print("ā Frontmatter issues have been fixed!\n")
|
|
608
676
|
|
|
609
677
|
def _check_agent_dependencies(self, args) -> CommandResult:
|
|
610
678
|
"""Check agent dependencies."""
|
|
@@ -684,7 +752,7 @@ class AgentsCommand(AgentCommand):
|
|
|
684
752
|
def _list_agent_dependencies(self, args) -> CommandResult:
|
|
685
753
|
"""List agent dependencies."""
|
|
686
754
|
try:
|
|
687
|
-
output_format =
|
|
755
|
+
output_format = self._get_output_format(args)
|
|
688
756
|
result = self.dependency_service.list_dependencies(
|
|
689
757
|
format_type=output_format
|
|
690
758
|
)
|
|
@@ -696,7 +764,7 @@ class AgentsCommand(AgentCommand):
|
|
|
696
764
|
if output_format == "pip":
|
|
697
765
|
for dep in result["dependencies"]:
|
|
698
766
|
print(dep)
|
|
699
|
-
elif output_format ==
|
|
767
|
+
elif str(output_format).lower() == OutputFormat.JSON:
|
|
700
768
|
print(json.dumps(result["data"], indent=2))
|
|
701
769
|
else: # text format
|
|
702
770
|
print("=" * 60)
|
|
@@ -854,7 +922,7 @@ class AgentsCommand(AgentCommand):
|
|
|
854
922
|
agents_dir=agents_dir, dry_run=dry_run
|
|
855
923
|
)
|
|
856
924
|
|
|
857
|
-
output_format =
|
|
925
|
+
output_format = self._get_output_format(args)
|
|
858
926
|
|
|
859
927
|
formatted = self._formatter.format_cleanup_result(
|
|
860
928
|
results, output_format=output_format, dry_run=dry_run
|
|
@@ -876,6 +944,510 @@ class AgentsCommand(AgentCommand):
|
|
|
876
944
|
self.logger.error(f"Error during cleanup: {e}", exc_info=True)
|
|
877
945
|
return CommandResult.error_result(f"Error during cleanup: {e}")
|
|
878
946
|
|
|
947
|
+
def _create_local_agent(self, args) -> CommandResult:
|
|
948
|
+
"""Create a new local agent template."""
|
|
949
|
+
try:
|
|
950
|
+
if getattr(args, "interactive", False):
|
|
951
|
+
# Launch interactive wizard
|
|
952
|
+
from ..interactive.agent_wizard import run_interactive_agent_wizard
|
|
953
|
+
|
|
954
|
+
exit_code = run_interactive_agent_wizard()
|
|
955
|
+
if exit_code == 0:
|
|
956
|
+
return CommandResult.success_result("Agent created successfully")
|
|
957
|
+
return CommandResult.error_result("Agent creation cancelled or failed")
|
|
958
|
+
|
|
959
|
+
# Non-interactive creation
|
|
960
|
+
from ...services.agents.local_template_manager import (
|
|
961
|
+
LocalAgentTemplateManager,
|
|
962
|
+
)
|
|
963
|
+
|
|
964
|
+
agent_id = getattr(args, "agent_id", None)
|
|
965
|
+
if not agent_id:
|
|
966
|
+
return CommandResult.error_result(
|
|
967
|
+
"--agent-id is required for non-interactive creation"
|
|
968
|
+
)
|
|
969
|
+
|
|
970
|
+
manager = LocalAgentTemplateManager()
|
|
971
|
+
name = getattr(args, "name", agent_id.replace("-", " ").title())
|
|
972
|
+
model = getattr(args, "model", "sonnet")
|
|
973
|
+
inherit_from = getattr(args, "inherit_from", None)
|
|
974
|
+
|
|
975
|
+
# Create basic template
|
|
976
|
+
template = manager.create_local_template(
|
|
977
|
+
agent_id=agent_id,
|
|
978
|
+
name=name,
|
|
979
|
+
description=f"Local agent: {name}",
|
|
980
|
+
instructions="# Agent Instructions\n\nCustomize this agent's behavior here.",
|
|
981
|
+
model=model,
|
|
982
|
+
parent_agent=inherit_from,
|
|
983
|
+
tier="project",
|
|
984
|
+
)
|
|
985
|
+
|
|
986
|
+
if template:
|
|
987
|
+
return CommandResult.success_result(
|
|
988
|
+
f"Created local agent '{agent_id}' in .claude-mpm/agents/",
|
|
989
|
+
data={
|
|
990
|
+
"agent_id": agent_id,
|
|
991
|
+
"path": f".claude-mpm/agents/{agent_id}.json",
|
|
992
|
+
},
|
|
993
|
+
)
|
|
994
|
+
return CommandResult.error_result("Failed to create agent template")
|
|
995
|
+
|
|
996
|
+
except Exception as e:
|
|
997
|
+
self.logger.error(f"Error creating local agent: {e}", exc_info=True)
|
|
998
|
+
return CommandResult.error_result(f"Error creating local agent: {e}")
|
|
999
|
+
|
|
1000
|
+
def _edit_local_agent(self, args) -> CommandResult:
|
|
1001
|
+
"""Edit a local agent template."""
|
|
1002
|
+
try:
|
|
1003
|
+
agent_id = getattr(args, "agent_id", None)
|
|
1004
|
+
if not agent_id:
|
|
1005
|
+
return CommandResult.error_result("agent_id is required")
|
|
1006
|
+
|
|
1007
|
+
import os
|
|
1008
|
+
import subprocess
|
|
1009
|
+
|
|
1010
|
+
from ...services.agents.local_template_manager import (
|
|
1011
|
+
LocalAgentTemplateManager,
|
|
1012
|
+
)
|
|
1013
|
+
|
|
1014
|
+
manager = LocalAgentTemplateManager()
|
|
1015
|
+
template = manager.get_local_template(agent_id)
|
|
1016
|
+
|
|
1017
|
+
if not template:
|
|
1018
|
+
return CommandResult.error_result(f"Local agent '{agent_id}' not found")
|
|
1019
|
+
|
|
1020
|
+
# Get template file path
|
|
1021
|
+
template_file = None
|
|
1022
|
+
if template.tier == "project":
|
|
1023
|
+
template_file = manager.project_agents_dir / f"{agent_id}.json"
|
|
1024
|
+
else:
|
|
1025
|
+
template_file = manager.user_agents_dir / f"{agent_id}.json"
|
|
1026
|
+
|
|
1027
|
+
if not template_file or not template_file.exists():
|
|
1028
|
+
return CommandResult.error_result(
|
|
1029
|
+
f"Template file not found for '{agent_id}'"
|
|
1030
|
+
)
|
|
1031
|
+
|
|
1032
|
+
if getattr(args, "interactive", False):
|
|
1033
|
+
# Launch interactive editor
|
|
1034
|
+
from ..interactive.agent_wizard import AgentWizard
|
|
1035
|
+
|
|
1036
|
+
wizard = AgentWizard()
|
|
1037
|
+
success, message = wizard._edit_agent_config(template)
|
|
1038
|
+
if success:
|
|
1039
|
+
return CommandResult.success_result(message)
|
|
1040
|
+
return CommandResult.error_result(message)
|
|
1041
|
+
|
|
1042
|
+
# Use system editor
|
|
1043
|
+
editor = getattr(args, "editor", None) or os.environ.get("EDITOR", "nano")
|
|
1044
|
+
subprocess.run([editor, str(template_file)], check=True)
|
|
1045
|
+
return CommandResult.success_result(
|
|
1046
|
+
f"Agent '{agent_id}' edited successfully"
|
|
1047
|
+
)
|
|
1048
|
+
|
|
1049
|
+
except subprocess.CalledProcessError:
|
|
1050
|
+
return CommandResult.error_result("Editor exited with error")
|
|
1051
|
+
except Exception as e:
|
|
1052
|
+
self.logger.error(f"Error editing local agent: {e}", exc_info=True)
|
|
1053
|
+
return CommandResult.error_result(f"Error editing local agent: {e}")
|
|
1054
|
+
|
|
1055
|
+
def _delete_local_agent(self, args) -> CommandResult:
|
|
1056
|
+
"""Delete local agent templates."""
|
|
1057
|
+
try:
|
|
1058
|
+
agent_ids = getattr(args, "agent_ids", [])
|
|
1059
|
+
if not agent_ids:
|
|
1060
|
+
return CommandResult.error_result("No agent IDs specified")
|
|
1061
|
+
|
|
1062
|
+
from ...services.agents.local_template_manager import (
|
|
1063
|
+
LocalAgentTemplateManager,
|
|
1064
|
+
)
|
|
1065
|
+
|
|
1066
|
+
manager = LocalAgentTemplateManager()
|
|
1067
|
+
force = getattr(args, "force", False)
|
|
1068
|
+
keep_deployment = getattr(args, "keep_deployment", False)
|
|
1069
|
+
backup = getattr(args, "backup", False)
|
|
1070
|
+
|
|
1071
|
+
# Confirmation if not forced
|
|
1072
|
+
if not force:
|
|
1073
|
+
print(f"\nā ļø This will delete {len(agent_ids)} agent(s):")
|
|
1074
|
+
for agent_id in agent_ids:
|
|
1075
|
+
print(f" - {agent_id}")
|
|
1076
|
+
confirm = input("\nAre you sure? [y/N]: ").strip().lower()
|
|
1077
|
+
if confirm not in ["y", "yes"]:
|
|
1078
|
+
return CommandResult.error_result("Deletion cancelled")
|
|
1079
|
+
|
|
1080
|
+
# Delete agents
|
|
1081
|
+
if len(agent_ids) == 1:
|
|
1082
|
+
result = manager.delete_local_template(
|
|
1083
|
+
agent_id=agent_ids[0],
|
|
1084
|
+
tier="all",
|
|
1085
|
+
delete_deployment=not keep_deployment,
|
|
1086
|
+
backup_first=backup,
|
|
1087
|
+
)
|
|
1088
|
+
if result["success"]:
|
|
1089
|
+
message = f"Successfully deleted agent '{agent_ids[0]}'"
|
|
1090
|
+
if result["backup_location"]:
|
|
1091
|
+
message += f"\nBackup saved to: {result['backup_location']}"
|
|
1092
|
+
return CommandResult.success_result(message, data=result)
|
|
1093
|
+
return CommandResult.error_result(
|
|
1094
|
+
f"Failed to delete agent: {', '.join(result['errors'])}"
|
|
1095
|
+
)
|
|
1096
|
+
results = manager.delete_multiple_templates(
|
|
1097
|
+
agent_ids=agent_ids,
|
|
1098
|
+
tier="all",
|
|
1099
|
+
delete_deployment=not keep_deployment,
|
|
1100
|
+
backup_first=backup,
|
|
1101
|
+
)
|
|
1102
|
+
|
|
1103
|
+
message = ""
|
|
1104
|
+
if results["successful"]:
|
|
1105
|
+
message = (
|
|
1106
|
+
f"Successfully deleted {len(results['successful'])} agent(s):\n"
|
|
1107
|
+
)
|
|
1108
|
+
for agent_id in results["successful"]:
|
|
1109
|
+
message += f" - {agent_id}\n"
|
|
1110
|
+
|
|
1111
|
+
if results["failed"]:
|
|
1112
|
+
if message:
|
|
1113
|
+
message += "\n"
|
|
1114
|
+
message += f"Failed to delete {len(results['failed'])} agent(s):\n"
|
|
1115
|
+
for agent_id in results["failed"]:
|
|
1116
|
+
errors = results["details"][agent_id]["errors"]
|
|
1117
|
+
message += f" - {agent_id}: {', '.join(errors)}\n"
|
|
1118
|
+
|
|
1119
|
+
if results["successful"]:
|
|
1120
|
+
return CommandResult.success_result(message.strip(), data=results)
|
|
1121
|
+
return CommandResult.error_result(message.strip(), data=results)
|
|
1122
|
+
|
|
1123
|
+
except Exception as e:
|
|
1124
|
+
self.logger.error(f"Error deleting local agents: {e}", exc_info=True)
|
|
1125
|
+
return CommandResult.error_result(f"Error deleting local agents: {e}")
|
|
1126
|
+
|
|
1127
|
+
def _manage_local_agents(self, args) -> CommandResult:
|
|
1128
|
+
"""Launch interactive management menu for local agents."""
|
|
1129
|
+
try:
|
|
1130
|
+
from ..interactive.agent_wizard import run_interactive_agent_manager
|
|
1131
|
+
|
|
1132
|
+
exit_code = run_interactive_agent_manager()
|
|
1133
|
+
if exit_code == 0:
|
|
1134
|
+
return CommandResult.success_result("Agent management completed")
|
|
1135
|
+
return CommandResult.error_result("Agent management failed or cancelled")
|
|
1136
|
+
|
|
1137
|
+
except Exception as e:
|
|
1138
|
+
self.logger.error(f"Error managing local agents: {e}", exc_info=True)
|
|
1139
|
+
return CommandResult.error_result(f"Error managing local agents: {e}")
|
|
1140
|
+
|
|
1141
|
+
def _configure_deployment(self, args) -> CommandResult:
|
|
1142
|
+
"""Configure agent deployment settings."""
|
|
1143
|
+
try:
|
|
1144
|
+
from pathlib import Path
|
|
1145
|
+
|
|
1146
|
+
import yaml
|
|
1147
|
+
|
|
1148
|
+
from claude_mpm.core.config import Config
|
|
1149
|
+
|
|
1150
|
+
config = Config()
|
|
1151
|
+
config_path = Path.cwd() / ".claude-mpm" / "configuration.yaml"
|
|
1152
|
+
|
|
1153
|
+
# Handle show command
|
|
1154
|
+
if getattr(args, "show", False):
|
|
1155
|
+
from ...services.agents.deployment.deployment_config_loader import (
|
|
1156
|
+
DeploymentConfigLoader,
|
|
1157
|
+
)
|
|
1158
|
+
|
|
1159
|
+
loader = DeploymentConfigLoader(self.logger)
|
|
1160
|
+
settings = loader.get_deployment_settings(config)
|
|
1161
|
+
|
|
1162
|
+
print("\nš Agent Deployment Configuration")
|
|
1163
|
+
print("=" * 50)
|
|
1164
|
+
print(f"Configuration file: {config_path}")
|
|
1165
|
+
print("\nš§ Deployment Settings:")
|
|
1166
|
+
print(f" Deploy system agents: {settings['deploy_system_agents']}")
|
|
1167
|
+
print(f" Deploy local agents: {settings['deploy_local_agents']}")
|
|
1168
|
+
print(f" Deploy user agents: {settings['deploy_user_agents']}")
|
|
1169
|
+
print(
|
|
1170
|
+
f" Prefer local over system: {settings['prefer_local_over_system']}"
|
|
1171
|
+
)
|
|
1172
|
+
print(f" Version comparison: {settings['version_comparison']}")
|
|
1173
|
+
|
|
1174
|
+
if settings["enabled_agents"]:
|
|
1175
|
+
print(
|
|
1176
|
+
f"\nā
Enabled agents: {', '.join(settings['enabled_agents'])}"
|
|
1177
|
+
)
|
|
1178
|
+
else:
|
|
1179
|
+
print("\nā
Enabled agents: All (no restrictions)")
|
|
1180
|
+
|
|
1181
|
+
if settings["disabled_agents"]:
|
|
1182
|
+
print(
|
|
1183
|
+
f"ā Disabled agents: {', '.join(settings['disabled_agents'])}"
|
|
1184
|
+
)
|
|
1185
|
+
else:
|
|
1186
|
+
print("ā Disabled agents: None")
|
|
1187
|
+
|
|
1188
|
+
print("\n" + "=" * 50)
|
|
1189
|
+
return CommandResult.success_result(
|
|
1190
|
+
"Displayed deployment configuration"
|
|
1191
|
+
)
|
|
1192
|
+
|
|
1193
|
+
# Handle interactive mode
|
|
1194
|
+
if getattr(args, "interactive", False):
|
|
1195
|
+
return self._configure_deployment_interactive(config_path)
|
|
1196
|
+
|
|
1197
|
+
# Load current configuration
|
|
1198
|
+
if not config_path.exists():
|
|
1199
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
1200
|
+
config_data = {}
|
|
1201
|
+
else:
|
|
1202
|
+
with config_path.open() as f:
|
|
1203
|
+
config_data = yaml.safe_load(f) or {}
|
|
1204
|
+
|
|
1205
|
+
# Ensure agent_deployment section exists
|
|
1206
|
+
if "agent_deployment" not in config_data:
|
|
1207
|
+
config_data["agent_deployment"] = {}
|
|
1208
|
+
|
|
1209
|
+
modified = False
|
|
1210
|
+
|
|
1211
|
+
# Handle enable/disable operations
|
|
1212
|
+
if getattr(args, "enable_all", False):
|
|
1213
|
+
config_data["agent_deployment"]["enabled_agents"] = []
|
|
1214
|
+
config_data["agent_deployment"]["disabled_agents"] = []
|
|
1215
|
+
print("ā
Enabled all agents for deployment")
|
|
1216
|
+
modified = True
|
|
1217
|
+
|
|
1218
|
+
if getattr(args, "enable_system", False):
|
|
1219
|
+
config_data["agent_deployment"]["deploy_system_agents"] = True
|
|
1220
|
+
print("ā
Enabled system agents for deployment")
|
|
1221
|
+
modified = True
|
|
1222
|
+
|
|
1223
|
+
if getattr(args, "disable_system", False):
|
|
1224
|
+
config_data["agent_deployment"]["deploy_system_agents"] = False
|
|
1225
|
+
print("ā Disabled system agents from deployment")
|
|
1226
|
+
modified = True
|
|
1227
|
+
|
|
1228
|
+
if getattr(args, "enable_local", False):
|
|
1229
|
+
config_data["agent_deployment"]["deploy_local_agents"] = True
|
|
1230
|
+
print("ā
Enabled local agents for deployment")
|
|
1231
|
+
modified = True
|
|
1232
|
+
|
|
1233
|
+
if getattr(args, "disable_local", False):
|
|
1234
|
+
config_data["agent_deployment"]["deploy_local_agents"] = False
|
|
1235
|
+
print("ā Disabled local agents from deployment")
|
|
1236
|
+
modified = True
|
|
1237
|
+
|
|
1238
|
+
if getattr(args, "enable", None):
|
|
1239
|
+
enabled = config_data["agent_deployment"].get("enabled_agents", [])
|
|
1240
|
+
disabled = config_data["agent_deployment"].get("disabled_agents", [])
|
|
1241
|
+
|
|
1242
|
+
for agent_id in args.enable:
|
|
1243
|
+
if agent_id not in enabled:
|
|
1244
|
+
enabled.append(agent_id)
|
|
1245
|
+
if agent_id in disabled:
|
|
1246
|
+
disabled.remove(agent_id)
|
|
1247
|
+
|
|
1248
|
+
config_data["agent_deployment"]["enabled_agents"] = enabled
|
|
1249
|
+
config_data["agent_deployment"]["disabled_agents"] = disabled
|
|
1250
|
+
print(f"ā
Enabled agents: {', '.join(args.enable)}")
|
|
1251
|
+
modified = True
|
|
1252
|
+
|
|
1253
|
+
if getattr(args, "disable", None):
|
|
1254
|
+
disabled = config_data["agent_deployment"].get("disabled_agents", [])
|
|
1255
|
+
|
|
1256
|
+
for agent_id in args.disable:
|
|
1257
|
+
if agent_id not in disabled:
|
|
1258
|
+
disabled.append(agent_id)
|
|
1259
|
+
|
|
1260
|
+
config_data["agent_deployment"]["disabled_agents"] = disabled
|
|
1261
|
+
print(f"ā Disabled agents: {', '.join(args.disable)}")
|
|
1262
|
+
modified = True
|
|
1263
|
+
|
|
1264
|
+
# Save configuration if modified
|
|
1265
|
+
if modified:
|
|
1266
|
+
with config_path.open("w") as f:
|
|
1267
|
+
yaml.dump(config_data, f, default_flow_style=False, sort_keys=False)
|
|
1268
|
+
print(f"\nš¾ Configuration saved to {config_path}")
|
|
1269
|
+
return CommandResult.success_result("Deployment configuration updated")
|
|
1270
|
+
|
|
1271
|
+
# If no modifications were made and not showing, display help
|
|
1272
|
+
if not getattr(args, "show", False):
|
|
1273
|
+
print("No configuration changes specified. Use --help for options.")
|
|
1274
|
+
return CommandResult.success_result("No changes made")
|
|
1275
|
+
|
|
1276
|
+
except Exception as e:
|
|
1277
|
+
self.logger.error(f"Error configuring deployment: {e}", exc_info=True)
|
|
1278
|
+
return CommandResult.error_result(f"Error configuring deployment: {e}")
|
|
1279
|
+
|
|
1280
|
+
def _configure_deployment_interactive(self, config_path: Path) -> CommandResult:
|
|
1281
|
+
"""Interactive mode for configuring agent deployment."""
|
|
1282
|
+
try:
|
|
1283
|
+
import yaml
|
|
1284
|
+
|
|
1285
|
+
from ...utils.ui_helpers import (
|
|
1286
|
+
prompt_choice,
|
|
1287
|
+
prompt_multiselect,
|
|
1288
|
+
prompt_yes_no,
|
|
1289
|
+
)
|
|
1290
|
+
|
|
1291
|
+
# Load current configuration
|
|
1292
|
+
if config_path.exists():
|
|
1293
|
+
with config_path.open() as f:
|
|
1294
|
+
config_data = yaml.safe_load(f) or {}
|
|
1295
|
+
else:
|
|
1296
|
+
config_data = {}
|
|
1297
|
+
|
|
1298
|
+
if "agent_deployment" not in config_data:
|
|
1299
|
+
config_data["agent_deployment"] = {}
|
|
1300
|
+
|
|
1301
|
+
settings = config_data["agent_deployment"]
|
|
1302
|
+
|
|
1303
|
+
print("\nš® Interactive Agent Deployment Configuration")
|
|
1304
|
+
print("=" * 50)
|
|
1305
|
+
|
|
1306
|
+
# Configure source types
|
|
1307
|
+
settings["deploy_system_agents"] = prompt_yes_no(
|
|
1308
|
+
"Deploy system agents?",
|
|
1309
|
+
default=settings.get("deploy_system_agents", True),
|
|
1310
|
+
)
|
|
1311
|
+
|
|
1312
|
+
settings["deploy_local_agents"] = prompt_yes_no(
|
|
1313
|
+
"Deploy local project agents?",
|
|
1314
|
+
default=settings.get("deploy_local_agents", True),
|
|
1315
|
+
)
|
|
1316
|
+
|
|
1317
|
+
settings["deploy_user_agents"] = prompt_yes_no(
|
|
1318
|
+
"Deploy user-level agents?",
|
|
1319
|
+
default=settings.get("deploy_user_agents", True),
|
|
1320
|
+
)
|
|
1321
|
+
|
|
1322
|
+
# Configure version behavior
|
|
1323
|
+
settings["prefer_local_over_system"] = prompt_yes_no(
|
|
1324
|
+
"Should local agents override system agents with same ID?",
|
|
1325
|
+
default=settings.get("prefer_local_over_system", True),
|
|
1326
|
+
)
|
|
1327
|
+
|
|
1328
|
+
settings["version_comparison"] = prompt_yes_no(
|
|
1329
|
+
"Compare versions across sources and deploy highest?",
|
|
1330
|
+
default=settings.get("version_comparison", True),
|
|
1331
|
+
)
|
|
1332
|
+
|
|
1333
|
+
# Configure specific agents
|
|
1334
|
+
choice = prompt_choice(
|
|
1335
|
+
"How would you like to configure specific agents?",
|
|
1336
|
+
[
|
|
1337
|
+
"No restrictions (all agents enabled)",
|
|
1338
|
+
"Specify disabled agents",
|
|
1339
|
+
"Specify enabled agents only",
|
|
1340
|
+
],
|
|
1341
|
+
)
|
|
1342
|
+
|
|
1343
|
+
if choice == "No restrictions (all agents enabled)":
|
|
1344
|
+
settings["enabled_agents"] = []
|
|
1345
|
+
settings["disabled_agents"] = []
|
|
1346
|
+
elif choice == "Specify disabled agents":
|
|
1347
|
+
# Get list of available agents
|
|
1348
|
+
from ...services.agents.listing_service import AgentListingService
|
|
1349
|
+
|
|
1350
|
+
listing_service = AgentListingService()
|
|
1351
|
+
agents, _ = listing_service.list_all_agents()
|
|
1352
|
+
agent_ids = sorted({agent.name for agent in agents})
|
|
1353
|
+
|
|
1354
|
+
if agent_ids:
|
|
1355
|
+
disabled = prompt_multiselect(
|
|
1356
|
+
"Select agents to disable:",
|
|
1357
|
+
agent_ids,
|
|
1358
|
+
default=settings.get("disabled_agents", []),
|
|
1359
|
+
)
|
|
1360
|
+
settings["disabled_agents"] = disabled
|
|
1361
|
+
settings["enabled_agents"] = []
|
|
1362
|
+
else:
|
|
1363
|
+
print("No agents found to configure")
|
|
1364
|
+
else: # Specify enabled agents only
|
|
1365
|
+
from ...services.agents.listing_service import AgentListingService
|
|
1366
|
+
|
|
1367
|
+
listing_service = AgentListingService()
|
|
1368
|
+
agents, _ = listing_service.list_all_agents()
|
|
1369
|
+
agent_ids = sorted({agent.name for agent in agents})
|
|
1370
|
+
|
|
1371
|
+
if agent_ids:
|
|
1372
|
+
enabled = prompt_multiselect(
|
|
1373
|
+
"Select agents to enable (others will be disabled):",
|
|
1374
|
+
agent_ids,
|
|
1375
|
+
default=settings.get("enabled_agents", []),
|
|
1376
|
+
)
|
|
1377
|
+
settings["enabled_agents"] = enabled
|
|
1378
|
+
settings["disabled_agents"] = []
|
|
1379
|
+
else:
|
|
1380
|
+
print("No agents found to configure")
|
|
1381
|
+
|
|
1382
|
+
# Save configuration
|
|
1383
|
+
config_data["agent_deployment"] = settings
|
|
1384
|
+
|
|
1385
|
+
# Ensure parent directory exists
|
|
1386
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
1387
|
+
|
|
1388
|
+
with config_path.open("w") as f:
|
|
1389
|
+
yaml.dump(config_data, f, default_flow_style=False, sort_keys=False)
|
|
1390
|
+
|
|
1391
|
+
print(f"\nā
Configuration saved to {config_path}")
|
|
1392
|
+
|
|
1393
|
+
# Show summary
|
|
1394
|
+
print("\nš New Configuration Summary:")
|
|
1395
|
+
print(
|
|
1396
|
+
f" System agents: {'Enabled' if settings.get('deploy_system_agents', True) else 'Disabled'}"
|
|
1397
|
+
)
|
|
1398
|
+
print(
|
|
1399
|
+
f" Local agents: {'Enabled' if settings.get('deploy_local_agents', True) else 'Disabled'}"
|
|
1400
|
+
)
|
|
1401
|
+
print(
|
|
1402
|
+
f" User agents: {'Enabled' if settings.get('deploy_user_agents', True) else 'Disabled'}"
|
|
1403
|
+
)
|
|
1404
|
+
|
|
1405
|
+
if settings.get("enabled_agents"):
|
|
1406
|
+
print(f" Enabled specific: {', '.join(settings['enabled_agents'])}")
|
|
1407
|
+
elif settings.get("disabled_agents"):
|
|
1408
|
+
print(f" Disabled specific: {', '.join(settings['disabled_agents'])}")
|
|
1409
|
+
else:
|
|
1410
|
+
print(" All agents enabled")
|
|
1411
|
+
|
|
1412
|
+
return CommandResult.success_result("Interactive configuration completed")
|
|
1413
|
+
|
|
1414
|
+
except KeyboardInterrupt:
|
|
1415
|
+
print("\n\nConfiguration cancelled.")
|
|
1416
|
+
return CommandResult.error_result("Configuration cancelled by user")
|
|
1417
|
+
except Exception as e:
|
|
1418
|
+
self.logger.error(f"Error in interactive configuration: {e}", exc_info=True)
|
|
1419
|
+
return CommandResult.error_result(
|
|
1420
|
+
f"Error in interactive configuration: {e}"
|
|
1421
|
+
)
|
|
1422
|
+
|
|
1423
|
+
def _detect_toolchain(self, args) -> CommandResult:
|
|
1424
|
+
"""Detect project toolchain without deploying agents.
|
|
1425
|
+
|
|
1426
|
+
Part of TSK-0054 Phase 5: Auto-configuration CLI integration.
|
|
1427
|
+
"""
|
|
1428
|
+
try:
|
|
1429
|
+
from .agents_detect import AgentsDetectCommand
|
|
1430
|
+
|
|
1431
|
+
cmd = AgentsDetectCommand()
|
|
1432
|
+
return cmd.run(args)
|
|
1433
|
+
except Exception as e:
|
|
1434
|
+
self.logger.error(f"Error detecting toolchain: {e}", exc_info=True)
|
|
1435
|
+
return CommandResult.error_result(f"Error detecting toolchain: {e}")
|
|
1436
|
+
|
|
1437
|
+
def _recommend_agents(self, args) -> CommandResult:
|
|
1438
|
+
"""Recommend agents based on project toolchain.
|
|
1439
|
+
|
|
1440
|
+
Part of TSK-0054 Phase 5: Auto-configuration CLI integration.
|
|
1441
|
+
"""
|
|
1442
|
+
try:
|
|
1443
|
+
from .agents_recommend import AgentsRecommendCommand
|
|
1444
|
+
|
|
1445
|
+
cmd = AgentsRecommendCommand()
|
|
1446
|
+
return cmd.run(args)
|
|
1447
|
+
except Exception as e:
|
|
1448
|
+
self.logger.error(f"Error recommending agents: {e}", exc_info=True)
|
|
1449
|
+
return CommandResult.error_result(f"Error recommending agents: {e}")
|
|
1450
|
+
|
|
879
1451
|
|
|
880
1452
|
def manage_agents(args):
|
|
881
1453
|
"""
|
|
@@ -887,7 +1459,7 @@ def manage_agents(args):
|
|
|
887
1459
|
result = command.execute(args)
|
|
888
1460
|
|
|
889
1461
|
# Print result if structured output format is requested
|
|
890
|
-
if
|
|
1462
|
+
if _is_structured_output(args):
|
|
891
1463
|
command.print_result(result, args)
|
|
892
1464
|
|
|
893
1465
|
return result.exit_code
|