claude-mpm 4.16.0__py3-none-any.whl → 4.25.10__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_ENGINEER.md +286 -0
- claude_mpm/agents/BASE_PM.md +272 -23
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +1821 -32
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/agent_loader.py +4 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/api_qa.json +5 -2
- claude_mpm/agents/templates/circuit_breakers.md +108 -2
- claude_mpm/agents/templates/documentation.json +33 -6
- claude_mpm/agents/templates/engineer.json +5 -1
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/php-engineer.json +10 -4
- claude_mpm/agents/templates/pm_red_flags.md +89 -19
- claude_mpm/agents/templates/project_organizer.json +7 -3
- claude_mpm/agents/templates/python_engineer.json +8 -3
- claude_mpm/agents/templates/qa.json +2 -1
- claude_mpm/agents/templates/react_engineer.json +1 -0
- claude_mpm/agents/templates/research.json +82 -12
- claude_mpm/agents/templates/rust_engineer.json +12 -7
- claude_mpm/agents/templates/security.json +4 -4
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +10 -6
- claude_mpm/agents/templates/version_control.json +4 -2
- claude_mpm/agents/templates/web_qa.json +2 -1
- claude_mpm/cli/README.md +253 -0
- claude_mpm/cli/__init__.py +11 -1
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
- claude_mpm/cli/commands/mpm_init/README.md +365 -0
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -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 +67 -1
- claude_mpm/cli/commands/run.py +124 -128
- claude_mpm/cli/commands/skills.py +922 -0
- claude_mpm/cli/executor.py +58 -0
- claude_mpm/cli/interactive/agent_wizard.py +5 -5
- claude_mpm/cli/parsers/base_parser.py +35 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
- claude_mpm/cli/parsers/skills_parser.py +275 -0
- claude_mpm/cli/startup.py +168 -8
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/cli_module/refactoring_guide.md +253 -0
- claude_mpm/commands/mpm-auto-configure.md +52 -0
- claude_mpm/commands/mpm-help.md +6 -0
- claude_mpm/commands/mpm-init.md +130 -8
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +2 -0
- claude_mpm/config/agent_capabilities.yaml +658 -0
- claude_mpm/config/agent_config.py +2 -2
- claude_mpm/config/async_logging_config.yaml +145 -0
- claude_mpm/constants.py +24 -0
- claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +14 -1
- claude_mpm/core/config.py +50 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +48 -3
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +39 -0
- claude_mpm/core/optimized_agent_loader.py +3 -3
- claude_mpm/d2/.gitignore +22 -0
- claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
- claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
- claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
- claude_mpm/d2/QUICKSTART.md +186 -0
- claude_mpm/d2/README.md +232 -0
- claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
- claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
- claude_mpm/d2/TESTING.md +288 -0
- claude_mpm/d2/index.html +118 -0
- claude_mpm/d2/package.json +19 -0
- claude_mpm/d2/src/App.svelte +110 -0
- claude_mpm/d2/src/components/Header.svelte +153 -0
- claude_mpm/d2/src/components/MainContent.svelte +74 -0
- claude_mpm/d2/src/components/Sidebar.svelte +85 -0
- claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
- claude_mpm/d2/src/lib/socketio.js +144 -0
- claude_mpm/d2/src/main.js +7 -0
- claude_mpm/d2/src/stores/events.js +114 -0
- claude_mpm/d2/src/stores/socket.js +108 -0
- claude_mpm/d2/src/stores/theme.js +65 -0
- claude_mpm/d2/svelte.config.js +12 -0
- claude_mpm/d2/vite.config.js +15 -0
- claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/BUILD_NUMBER +1 -0
- claude_mpm/dashboard/README.md +121 -0
- claude_mpm/dashboard/VERSION +1 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
- claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
- claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
- claude_mpm/dashboard/react/entries/events.tsx +165 -0
- claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
- claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
- claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
- claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
- claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
- claude_mpm/dashboard/static/built/connection-manager.js +76 -76
- claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
- claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/built/react/events.js.map +1 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/built/shared/logger.js +16 -16
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/index.html +22 -22
- claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/js/shared/logger.js +16 -16
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/static/navigation-test-results.md +118 -0
- claude_mpm/dashboard/static/production/main.html +21 -21
- claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
- claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/hooks/README.md +143 -0
- claude_mpm/hooks/__init__.py +8 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/README.md +180 -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/templates/settings.json.example +147 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/agent_schema.json +596 -0
- claude_mpm/schemas/frontmatter_schema.json +165 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/auto_config_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
- claude_mpm/services/agents/deployment/agent_validator.py +17 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
- claude_mpm/services/agents/local_template_manager.py +4 -2
- claude_mpm/services/agents/recommender.py +47 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +87 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/models/agent_config.py +3 -0
- claude_mpm/services/core/models/process.py +4 -0
- claude_mpm/services/core/path_resolver.py +1 -1
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
- claude_mpm/services/diagnostics/models.py +21 -0
- claude_mpm/services/event_bus/README.md +244 -0
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/event_bus/relay.py +23 -7
- claude_mpm/services/events/README.md +303 -0
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/framework_claude_md_generator/README.md +119 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +2 -0
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_config_manager.py +7 -131
- claude_mpm/services/mcp_gateway/README.md +185 -0
- claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/memory/failure_tracker.py +19 -4
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +1 -1
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/session_manager.py +205 -1
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
- claude_mpm/services/static/.gitkeep +2 -0
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/unified/deployment_strategies/local.py +1 -1
- claude_mpm/services/version_control/VERSION +1 -0
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +21 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/.gitkeep +2 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -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/LICENSE.txt +202 -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/mcp-builder/scripts/example_evaluation.xml +22 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
- claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -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/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -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 +97 -9
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/templates/questions/EXAMPLES.md +501 -0
- claude_mpm/templates/questions/__init__.py +43 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +314 -0
- claude_mpm/templates/questions/project_init.py +388 -0
- claude_mpm/templates/questions/ticket_mgmt.py +397 -0
- claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/tools/code_tree_analyzer/README.md +64 -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/utils/agent_dependency_loader.py +5 -5
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm-4.25.10.dist-info/METADATA +789 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +485 -240
- claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md +0 -602
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/cli/commands/mpm_init.py +0 -2008
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- claude_mpm-4.16.0.dist-info/METADATA +0 -453
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
"""Hook Error Memory System.
|
|
2
|
+
|
|
3
|
+
This module provides error detection and memory for hook execution to prevent
|
|
4
|
+
repeated errors and provide helpful diagnostics.
|
|
5
|
+
|
|
6
|
+
WHY this is needed:
|
|
7
|
+
- Hook processor can encounter transient or persistent errors
|
|
8
|
+
- Repeated failing commands waste resources and clutter logs
|
|
9
|
+
- Users need actionable suggestions to fix configuration issues
|
|
10
|
+
- System should learn from errors and prevent repetition
|
|
11
|
+
|
|
12
|
+
DESIGN DECISION: Store errors in JSON file rather than database because:
|
|
13
|
+
- Simple, human-readable format
|
|
14
|
+
- Easy to inspect and manually clear
|
|
15
|
+
- No additional dependencies
|
|
16
|
+
- Fast read/write for small datasets
|
|
17
|
+
- Users can easily delete to retry failed commands
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
import re
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from typing import Any, Dict, Optional
|
|
25
|
+
|
|
26
|
+
from ..core.logger import get_logger
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class HookErrorMemory:
|
|
30
|
+
"""Tracks and prevents repeated hook execution errors.
|
|
31
|
+
|
|
32
|
+
WHY this design:
|
|
33
|
+
- Detects common error patterns automatically
|
|
34
|
+
- Stores error history to prevent repetition
|
|
35
|
+
- Provides actionable fix suggestions
|
|
36
|
+
- Allows manual retry by clearing memory
|
|
37
|
+
- Minimal performance overhead (<1ms per check)
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
# Error pattern definitions with detection regexes
|
|
41
|
+
ERROR_PATTERNS = [
|
|
42
|
+
(r"no such file or directory[:\s]+(.+?)(?:\n|$)", "file_not_found"),
|
|
43
|
+
(r"command not found[:\s]+(.+?)(?:\n|$)", "command_not_found"),
|
|
44
|
+
(r"permission denied[:\s]+(.+?)(?:\n|$)", "permission_denied"),
|
|
45
|
+
(r"syntax error", "syntax_error"),
|
|
46
|
+
(r"Error:\s*\(eval\):(\d+):\s*(.+?)(?:\n|$)", "eval_error"),
|
|
47
|
+
(r"Error:\s*(.+?)(?:\n|$)", "general_error"),
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
def __init__(self, memory_file: Optional[Path] = None):
|
|
51
|
+
"""Initialize hook error memory.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
memory_file: Path to memory file (default: .claude-mpm/hook_errors.json)
|
|
55
|
+
"""
|
|
56
|
+
self.logger = get_logger("hook_error_memory")
|
|
57
|
+
|
|
58
|
+
# Use default location if not specified
|
|
59
|
+
if memory_file is None:
|
|
60
|
+
memory_file = Path.cwd() / ".claude-mpm" / "hook_errors.json"
|
|
61
|
+
|
|
62
|
+
self.memory_file = memory_file
|
|
63
|
+
self.errors: Dict[str, Any] = self._load_errors()
|
|
64
|
+
|
|
65
|
+
def _load_errors(self) -> Dict[str, Any]:
|
|
66
|
+
"""Load previously encountered errors from disk.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
Dictionary of error records
|
|
70
|
+
"""
|
|
71
|
+
if not self.memory_file.exists():
|
|
72
|
+
return {}
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
content = self.memory_file.read_text()
|
|
76
|
+
if not content.strip():
|
|
77
|
+
return {}
|
|
78
|
+
return json.loads(content)
|
|
79
|
+
except json.JSONDecodeError as e:
|
|
80
|
+
self.logger.warning(f"Failed to parse error memory file: {e}")
|
|
81
|
+
return {}
|
|
82
|
+
except Exception as e:
|
|
83
|
+
self.logger.error(f"Error loading error memory: {e}")
|
|
84
|
+
return {}
|
|
85
|
+
|
|
86
|
+
def _save_errors(self):
|
|
87
|
+
"""Persist errors to disk."""
|
|
88
|
+
try:
|
|
89
|
+
# Ensure directory exists
|
|
90
|
+
self.memory_file.parent.mkdir(parents=True, exist_ok=True)
|
|
91
|
+
|
|
92
|
+
# Write with pretty formatting for human readability
|
|
93
|
+
self.memory_file.write_text(json.dumps(self.errors, indent=2))
|
|
94
|
+
except Exception as e:
|
|
95
|
+
self.logger.error(f"Failed to save error memory: {e}")
|
|
96
|
+
|
|
97
|
+
def detect_error(
|
|
98
|
+
self, output: str, stderr: str, returncode: int
|
|
99
|
+
) -> Optional[Dict[str, str]]:
|
|
100
|
+
"""Detect if output contains an error.
|
|
101
|
+
|
|
102
|
+
WHY check both stdout and stderr:
|
|
103
|
+
- Some commands write errors to stdout
|
|
104
|
+
- Some write to stderr
|
|
105
|
+
- Return code alone isn't enough (some hooks return non-zero on purpose)
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
output: Standard output from command
|
|
109
|
+
stderr: Standard error from command
|
|
110
|
+
returncode: Exit code from command
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
Dict with error info if detected, None otherwise
|
|
114
|
+
"""
|
|
115
|
+
# Combine output sources for comprehensive error detection
|
|
116
|
+
combined_output = f"{output}\n{stderr}"
|
|
117
|
+
|
|
118
|
+
# Try each pattern in order of specificity
|
|
119
|
+
for pattern, error_type in self.ERROR_PATTERNS:
|
|
120
|
+
match = re.search(pattern, combined_output, re.IGNORECASE | re.MULTILINE)
|
|
121
|
+
if match:
|
|
122
|
+
# Extract details from the match
|
|
123
|
+
details = match.group(1) if match.groups() else match.group(0)
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
"type": error_type,
|
|
127
|
+
"pattern": pattern,
|
|
128
|
+
"match": match.group(0).strip(),
|
|
129
|
+
"details": details.strip() if details else "",
|
|
130
|
+
"returncode": returncode,
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
# If no pattern matched but returncode is non-zero, record as generic error
|
|
134
|
+
if returncode != 0 and combined_output.strip():
|
|
135
|
+
return {
|
|
136
|
+
"type": "unknown_error",
|
|
137
|
+
"pattern": "non-zero exit code",
|
|
138
|
+
"match": f"Exit code: {returncode}",
|
|
139
|
+
"details": combined_output[:200].strip(), # First 200 chars
|
|
140
|
+
"returncode": returncode,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
def record_error(self, error_info: Dict[str, str], hook_type: str):
|
|
146
|
+
"""Record an error to prevent future repetition.
|
|
147
|
+
|
|
148
|
+
WHY use composite key:
|
|
149
|
+
- Same error type can occur with different details
|
|
150
|
+
- Want to track specific error instances
|
|
151
|
+
- Hook type context helps with diagnosis
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
error_info: Error information from detect_error()
|
|
155
|
+
hook_type: Type of hook that failed (e.g., "PreToolUse")
|
|
156
|
+
"""
|
|
157
|
+
# Create unique key for this error
|
|
158
|
+
key = f"{error_info['type']}:{hook_type}:{error_info['details']}"
|
|
159
|
+
|
|
160
|
+
now = datetime.now(timezone.utc).isoformat()
|
|
161
|
+
|
|
162
|
+
if key in self.errors:
|
|
163
|
+
# Update existing error
|
|
164
|
+
self.errors[key]["count"] += 1
|
|
165
|
+
self.errors[key]["last_seen"] = now
|
|
166
|
+
else:
|
|
167
|
+
# Record new error
|
|
168
|
+
self.errors[key] = {
|
|
169
|
+
"type": error_info["type"],
|
|
170
|
+
"hook_type": hook_type,
|
|
171
|
+
"details": error_info["details"],
|
|
172
|
+
"match": error_info["match"],
|
|
173
|
+
"returncode": error_info.get("returncode", 1),
|
|
174
|
+
"count": 1,
|
|
175
|
+
"first_seen": now,
|
|
176
|
+
"last_seen": now,
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
self._save_errors()
|
|
180
|
+
self.logger.debug(
|
|
181
|
+
f"Recorded error: {error_info['type']} (count: {self.errors[key]['count']})"
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
def is_known_failing_hook(self, hook_type: str) -> Optional[Dict[str, Any]]:
|
|
185
|
+
"""Check if a hook type is known to fail repeatedly.
|
|
186
|
+
|
|
187
|
+
WHY check for 2+ failures:
|
|
188
|
+
- Single failure could be transient
|
|
189
|
+
- 2+ failures indicate persistent issue
|
|
190
|
+
- Balance between retry attempts and error prevention
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
hook_type: Type of hook to check
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
Error data if hook is known to fail, None otherwise
|
|
197
|
+
"""
|
|
198
|
+
# Find any errors for this hook type with 2+ occurrences
|
|
199
|
+
for key, error_data in self.errors.items():
|
|
200
|
+
if error_data["hook_type"] == hook_type and error_data["count"] >= 2:
|
|
201
|
+
return error_data
|
|
202
|
+
|
|
203
|
+
return None
|
|
204
|
+
|
|
205
|
+
def should_skip_hook(self, hook_type: str, threshold: int = 2) -> bool:
|
|
206
|
+
"""Determine if a hook should be skipped due to repeated failures.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
hook_type: Type of hook to check
|
|
210
|
+
threshold: Minimum failure count to skip (default: 2)
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
True if hook should be skipped
|
|
214
|
+
"""
|
|
215
|
+
error_data = self.is_known_failing_hook(hook_type)
|
|
216
|
+
return error_data is not None and error_data["count"] >= threshold
|
|
217
|
+
|
|
218
|
+
def suggest_fix(self, error_info: Dict[str, str]) -> str:
|
|
219
|
+
"""Suggest a fix for the detected error.
|
|
220
|
+
|
|
221
|
+
WHY provide suggestions:
|
|
222
|
+
- Users need actionable guidance
|
|
223
|
+
- Common errors have known solutions
|
|
224
|
+
- Reduces support burden
|
|
225
|
+
- Improves user experience
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
error_info: Error information from detect_error()
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
Human-readable fix suggestion
|
|
232
|
+
"""
|
|
233
|
+
error_type = error_info["type"]
|
|
234
|
+
details = error_info.get("details", "")
|
|
235
|
+
|
|
236
|
+
suggestions = {
|
|
237
|
+
"file_not_found": f"""File not found: {details}
|
|
238
|
+
|
|
239
|
+
Possible fixes:
|
|
240
|
+
1. Check if the file exists: ls -la {details}
|
|
241
|
+
2. Verify the path is correct in your hook configuration
|
|
242
|
+
3. If it's a script, ensure it's executable: chmod +x {details}
|
|
243
|
+
4. Clear error memory to retry: rm {self.memory_file}
|
|
244
|
+
""",
|
|
245
|
+
"command_not_found": f"""Command not found: {details}
|
|
246
|
+
|
|
247
|
+
Possible fixes:
|
|
248
|
+
1. Install the missing command
|
|
249
|
+
2. Check if it's in your PATH: which {details}
|
|
250
|
+
3. Update hook configuration to use absolute path
|
|
251
|
+
4. Remove the hook if no longer needed
|
|
252
|
+
""",
|
|
253
|
+
"permission_denied": f"""Permission denied: {details}
|
|
254
|
+
|
|
255
|
+
Possible fixes:
|
|
256
|
+
1. Check file permissions: ls -la {details}
|
|
257
|
+
2. Make file executable: chmod +x {details}
|
|
258
|
+
3. Run with appropriate privileges
|
|
259
|
+
4. Check file ownership
|
|
260
|
+
""",
|
|
261
|
+
"syntax_error": """Syntax error in hook configuration or script
|
|
262
|
+
|
|
263
|
+
Possible fixes:
|
|
264
|
+
1. Review hook configuration in .claude-mpm/config
|
|
265
|
+
2. Check script syntax if using shell hooks
|
|
266
|
+
3. Validate JSON configuration format
|
|
267
|
+
4. Check for typos in hook definitions
|
|
268
|
+
""",
|
|
269
|
+
"eval_error": f"""Error in hook execution: {details}
|
|
270
|
+
|
|
271
|
+
Possible fixes:
|
|
272
|
+
1. Review hook handler logs for details
|
|
273
|
+
2. Check hook configuration syntax
|
|
274
|
+
3. Verify all required dependencies are available
|
|
275
|
+
4. Test hook handler manually: python {details}
|
|
276
|
+
""",
|
|
277
|
+
"general_error": f"""Error during hook execution: {error_info.get("match", "Unknown error")}
|
|
278
|
+
|
|
279
|
+
Possible fixes:
|
|
280
|
+
1. Check logs for detailed error information
|
|
281
|
+
2. Verify hook configuration is correct
|
|
282
|
+
3. Ensure all dependencies are installed
|
|
283
|
+
4. Clear error memory to retry: rm {self.memory_file}
|
|
284
|
+
""",
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return suggestions.get(
|
|
288
|
+
error_type, f"Unknown error type: {error_type}\n\nDetails: {details}"
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
def clear_errors(self, hook_type: Optional[str] = None):
|
|
292
|
+
"""Clear error memory to allow retry of failed hooks.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
hook_type: If specified, only clear errors for this hook type
|
|
296
|
+
"""
|
|
297
|
+
if hook_type is None:
|
|
298
|
+
# Clear all errors
|
|
299
|
+
count = len(self.errors)
|
|
300
|
+
self.errors.clear()
|
|
301
|
+
self._save_errors()
|
|
302
|
+
self.logger.info(f"Cleared all {count} error records")
|
|
303
|
+
else:
|
|
304
|
+
# Clear errors for specific hook type
|
|
305
|
+
keys_to_remove = [
|
|
306
|
+
key
|
|
307
|
+
for key, data in self.errors.items()
|
|
308
|
+
if data["hook_type"] == hook_type
|
|
309
|
+
]
|
|
310
|
+
for key in keys_to_remove:
|
|
311
|
+
del self.errors[key]
|
|
312
|
+
self._save_errors()
|
|
313
|
+
self.logger.info(
|
|
314
|
+
f"Cleared {len(keys_to_remove)} error records for {hook_type}"
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
def get_error_summary(self) -> Dict[str, Any]:
|
|
318
|
+
"""Get summary of all recorded errors.
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
Dictionary with error statistics and details
|
|
322
|
+
"""
|
|
323
|
+
if not self.errors:
|
|
324
|
+
return {
|
|
325
|
+
"total_errors": 0,
|
|
326
|
+
"unique_errors": 0,
|
|
327
|
+
"errors_by_type": {},
|
|
328
|
+
"errors_by_hook": {},
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
errors_by_type = {}
|
|
332
|
+
errors_by_hook = {}
|
|
333
|
+
|
|
334
|
+
total_count = 0
|
|
335
|
+
|
|
336
|
+
for error_data in self.errors.values():
|
|
337
|
+
error_type = error_data["type"]
|
|
338
|
+
hook_type = error_data["hook_type"]
|
|
339
|
+
count = error_data["count"]
|
|
340
|
+
|
|
341
|
+
total_count += count
|
|
342
|
+
|
|
343
|
+
errors_by_type[error_type] = errors_by_type.get(error_type, 0) + count
|
|
344
|
+
errors_by_hook[hook_type] = errors_by_hook.get(hook_type, 0) + count
|
|
345
|
+
|
|
346
|
+
return {
|
|
347
|
+
"total_errors": total_count,
|
|
348
|
+
"unique_errors": len(self.errors),
|
|
349
|
+
"errors_by_type": errors_by_type,
|
|
350
|
+
"errors_by_hook": errors_by_hook,
|
|
351
|
+
"memory_file": str(self.memory_file),
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
# Global instance
|
|
356
|
+
_hook_error_memory: Optional[HookErrorMemory] = None
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def get_hook_error_memory(memory_file: Optional[Path] = None) -> HookErrorMemory:
|
|
360
|
+
"""Get the global hook error memory instance.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
memory_file: Optional custom memory file path
|
|
364
|
+
|
|
365
|
+
Returns:
|
|
366
|
+
HookErrorMemory instance
|
|
367
|
+
"""
|
|
368
|
+
global _hook_error_memory
|
|
369
|
+
if _hook_error_memory is None:
|
|
370
|
+
_hook_error_memory = HookErrorMemory(memory_file)
|
|
371
|
+
return _hook_error_memory
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def clear_hook_errors(hook_type: Optional[str] = None):
|
|
375
|
+
"""Convenience function to clear hook error memory.
|
|
376
|
+
|
|
377
|
+
Args:
|
|
378
|
+
hook_type: If specified, only clear errors for this hook type
|
|
379
|
+
"""
|
|
380
|
+
memory = get_hook_error_memory()
|
|
381
|
+
memory.clear_errors(hook_type)
|
claude_mpm/core/hook_manager.py
CHANGED
|
@@ -23,6 +23,7 @@ from datetime import datetime, timezone
|
|
|
23
23
|
from typing import Any, Dict, Optional
|
|
24
24
|
|
|
25
25
|
from ..core.logger import get_logger
|
|
26
|
+
from .hook_error_memory import get_hook_error_memory
|
|
26
27
|
from .hook_performance_config import get_hook_performance_config
|
|
27
28
|
from .unified_paths import get_package_root
|
|
28
29
|
|
|
@@ -42,6 +43,9 @@ class HookManager:
|
|
|
42
43
|
self.session_id = self._get_or_create_session_id()
|
|
43
44
|
self.hook_handler_path = self._find_hook_handler()
|
|
44
45
|
|
|
46
|
+
# Initialize error memory for tracking and preventing repeated errors
|
|
47
|
+
self.error_memory = get_hook_error_memory()
|
|
48
|
+
|
|
45
49
|
# Initialize background hook processing for async execution
|
|
46
50
|
self.performance_config = get_hook_performance_config()
|
|
47
51
|
queue_config = self.performance_config.get_queue_config()
|
|
@@ -97,11 +101,31 @@ class HookManager:
|
|
|
97
101
|
self.logger.debug("Started background hook processor thread")
|
|
98
102
|
|
|
99
103
|
def _execute_hook_sync(self, hook_data: Dict[str, Any]):
|
|
100
|
-
"""Execute a single hook synchronously in the background thread.
|
|
104
|
+
"""Execute a single hook synchronously in the background thread with error detection.
|
|
105
|
+
|
|
106
|
+
WHY error detection:
|
|
107
|
+
- Prevents repeated execution of failing hooks
|
|
108
|
+
- Provides actionable error messages to users
|
|
109
|
+
- Learns from failures to improve system reliability
|
|
110
|
+
- Reduces log noise from repeated errors
|
|
111
|
+
"""
|
|
101
112
|
try:
|
|
102
113
|
hook_type = hook_data["hook_type"]
|
|
103
114
|
event_data = hook_data["event_data"]
|
|
104
115
|
|
|
116
|
+
# Check if this hook is known to fail repeatedly
|
|
117
|
+
if self.error_memory.should_skip_hook(hook_type):
|
|
118
|
+
known_error = self.error_memory.is_known_failing_hook(hook_type)
|
|
119
|
+
if known_error:
|
|
120
|
+
# Log warning but don't spam - only on first skip
|
|
121
|
+
if known_error["count"] == 2: # First time we're skipping
|
|
122
|
+
self.logger.warning(
|
|
123
|
+
f"⚠️ Skipping {hook_type} hook - failed {known_error['count']} times previously\n"
|
|
124
|
+
f"Error: {known_error['match']}\n"
|
|
125
|
+
f"To retry: rm {self.error_memory.memory_file}"
|
|
126
|
+
)
|
|
127
|
+
return
|
|
128
|
+
|
|
105
129
|
# Create the hook event
|
|
106
130
|
hook_event = {
|
|
107
131
|
"hook_event_name": hook_type,
|
|
@@ -127,7 +151,22 @@ class HookManager:
|
|
|
127
151
|
check=False,
|
|
128
152
|
)
|
|
129
153
|
|
|
130
|
-
|
|
154
|
+
# Detect errors in the output
|
|
155
|
+
error_info = self.error_memory.detect_error(
|
|
156
|
+
result.stdout or "", result.stderr or "", result.returncode
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
if error_info:
|
|
160
|
+
# Record the error
|
|
161
|
+
self.error_memory.record_error(error_info, hook_type)
|
|
162
|
+
|
|
163
|
+
# Get fix suggestion
|
|
164
|
+
suggestion = self.error_memory.suggest_fix(error_info)
|
|
165
|
+
|
|
166
|
+
# Log error with suggestion
|
|
167
|
+
self.logger.warning(f"Hook {hook_type} error detected:\n{suggestion}")
|
|
168
|
+
elif result.returncode != 0:
|
|
169
|
+
# Non-zero return without detected pattern
|
|
131
170
|
self.logger.debug(f"Hook {hook_type} returned code {result.returncode}")
|
|
132
171
|
if result.stderr:
|
|
133
172
|
self.logger.debug(f"Hook stderr: {result.stderr}")
|
|
@@ -85,8 +85,8 @@ class InteractiveSession:
|
|
|
85
85
|
self.logger.warning(f"WebSocket initialization failed: {error}")
|
|
86
86
|
# Continue without WebSocket - not a fatal error
|
|
87
87
|
|
|
88
|
-
#
|
|
89
|
-
|
|
88
|
+
# Banner now displayed in CLI startup - see startup_display.py
|
|
89
|
+
# Removed duplicate _display_welcome_message() to consolidate with main banner
|
|
90
90
|
|
|
91
91
|
# Log session start
|
|
92
92
|
if self.runner.project_logger:
|
|
@@ -293,7 +293,12 @@ class InteractiveSession:
|
|
|
293
293
|
return False, f"Unexpected error with Socket.IO: {e}"
|
|
294
294
|
|
|
295
295
|
def _display_welcome_message(self) -> None:
|
|
296
|
-
"""Display the interactive session welcome message.
|
|
296
|
+
"""Display the interactive session welcome message.
|
|
297
|
+
|
|
298
|
+
DEPRECATED: This method is kept for backward compatibility with tests.
|
|
299
|
+
The main banner is now displayed in startup_display.py during CLI startup.
|
|
300
|
+
This consolidated approach prevents duplicate banners.
|
|
301
|
+
"""
|
|
297
302
|
version_str = self.runner._get_version()
|
|
298
303
|
|
|
299
304
|
# Get output style status
|
|
@@ -383,6 +388,14 @@ class InteractiveSession:
|
|
|
383
388
|
self.logger.debug(f"Raw claude_args received: {self.runner.claude_args}")
|
|
384
389
|
cmd.extend(self.runner.claude_args)
|
|
385
390
|
|
|
391
|
+
# Add --agents flag if native agents mode is enabled
|
|
392
|
+
if getattr(self.runner, "use_native_agents", False):
|
|
393
|
+
agents_flag = self._build_agents_flag()
|
|
394
|
+
if agents_flag:
|
|
395
|
+
# Add --agents JSON directly (already properly formatted)
|
|
396
|
+
cmd.extend(agents_flag)
|
|
397
|
+
self.logger.info("✓ Native agents mode: Using --agents CLI flag")
|
|
398
|
+
|
|
386
399
|
# Add system instructions
|
|
387
400
|
from claude_mpm.core.claude_runner import create_simple_context
|
|
388
401
|
|
|
@@ -402,6 +415,38 @@ class InteractiveSession:
|
|
|
402
415
|
|
|
403
416
|
return cmd
|
|
404
417
|
|
|
418
|
+
def _build_agents_flag(self) -> Optional[list]:
|
|
419
|
+
"""Build --agents flag with all MPM agents.
|
|
420
|
+
|
|
421
|
+
Returns:
|
|
422
|
+
List with ["--agents", "<json>"] or None if conversion fails
|
|
423
|
+
"""
|
|
424
|
+
try:
|
|
425
|
+
from claude_mpm.services.native_agent_converter import NativeAgentConverter
|
|
426
|
+
|
|
427
|
+
converter = NativeAgentConverter()
|
|
428
|
+
agents = converter.load_agents_from_templates()
|
|
429
|
+
|
|
430
|
+
if not agents:
|
|
431
|
+
self.logger.warning("No agents loaded for native mode")
|
|
432
|
+
return None
|
|
433
|
+
|
|
434
|
+
# Generate JSON for --agents flag
|
|
435
|
+
agents_json = converter.generate_agents_json(agents)
|
|
436
|
+
summary = converter.get_conversion_summary(agents)
|
|
437
|
+
|
|
438
|
+
self.logger.info(
|
|
439
|
+
f"Native agents: {summary['total_agents']} agents, "
|
|
440
|
+
f"{summary['json_size_kb']} KB JSON"
|
|
441
|
+
)
|
|
442
|
+
|
|
443
|
+
# Return as list: ["--agents", "<json>"]
|
|
444
|
+
return ["--agents", agents_json]
|
|
445
|
+
|
|
446
|
+
except Exception as e:
|
|
447
|
+
self.logger.error(f"Failed to build --agents flag: {e}", exc_info=True)
|
|
448
|
+
return None
|
|
449
|
+
|
|
405
450
|
def _prepare_environment(self) -> dict:
|
|
406
451
|
"""Prepare clean environment variables for Claude."""
|
|
407
452
|
clean_env = os.environ.copy()
|
claude_mpm/core/interfaces.py
CHANGED
|
@@ -33,7 +33,62 @@ from pathlib import Path
|
|
|
33
33
|
from typing import Any, Dict, Generic, List, Optional, Tuple, TypeVar
|
|
34
34
|
|
|
35
35
|
# Re-export everything from the new location for backward compatibility
|
|
36
|
-
from claude_mpm.services.core.interfaces import
|
|
36
|
+
from claude_mpm.services.core.interfaces import ( # noqa: F401
|
|
37
|
+
AgentCapabilitiesInterface,
|
|
38
|
+
AgentDeploymentInterface,
|
|
39
|
+
AgentMetadata,
|
|
40
|
+
CacheEntry,
|
|
41
|
+
CommandHandlerInterface,
|
|
42
|
+
HealthStatus,
|
|
43
|
+
HookServiceInterface,
|
|
44
|
+
IAgentRecommender,
|
|
45
|
+
IAgentRegistry,
|
|
46
|
+
IAutoConfigManager,
|
|
47
|
+
ICacheService,
|
|
48
|
+
IConfigurationManager,
|
|
49
|
+
IConfigurationService,
|
|
50
|
+
ICrashDetector,
|
|
51
|
+
IDeploymentStateManager,
|
|
52
|
+
IErrorHandler,
|
|
53
|
+
IEventBus,
|
|
54
|
+
IHealthCheck,
|
|
55
|
+
IHealthCheckManager,
|
|
56
|
+
IHealthMonitor,
|
|
57
|
+
ILocalProcessManager,
|
|
58
|
+
ILogMonitor,
|
|
59
|
+
IMemoryLeakDetector,
|
|
60
|
+
IModelProvider,
|
|
61
|
+
IModelRouter,
|
|
62
|
+
InterfaceRegistry,
|
|
63
|
+
IPerformanceMonitor,
|
|
64
|
+
IPromptCache,
|
|
65
|
+
IResourceMonitor,
|
|
66
|
+
IRestartManager,
|
|
67
|
+
IRestartPolicy,
|
|
68
|
+
IServiceContainer,
|
|
69
|
+
IServiceFactory,
|
|
70
|
+
IServiceLifecycle,
|
|
71
|
+
IStructuredLogger,
|
|
72
|
+
ITemplateManager,
|
|
73
|
+
IToolchainAnalyzer,
|
|
74
|
+
MemoryHookInterface,
|
|
75
|
+
MemoryServiceInterface,
|
|
76
|
+
ModelCapability,
|
|
77
|
+
ModelProvider,
|
|
78
|
+
ModelResponse,
|
|
79
|
+
ProjectAnalyzerInterface,
|
|
80
|
+
RunnerConfigurationInterface,
|
|
81
|
+
ServiceType,
|
|
82
|
+
SessionManagementInterface,
|
|
83
|
+
SocketIOServiceInterface,
|
|
84
|
+
SubprocessLauncherInterface,
|
|
85
|
+
SystemInstructionsInterface,
|
|
86
|
+
T,
|
|
87
|
+
TemplateRenderContext,
|
|
88
|
+
TicketManagerInterface,
|
|
89
|
+
UtilityServiceInterface,
|
|
90
|
+
VersionServiceInterface,
|
|
91
|
+
)
|
|
37
92
|
|
|
38
93
|
# Type variables for generic interfaces
|
|
39
94
|
T = TypeVar("T")
|
claude_mpm/core/logger.py
CHANGED
|
@@ -225,7 +225,9 @@ def setup_logging(
|
|
|
225
225
|
|
|
226
226
|
# Use rotating file handler
|
|
227
227
|
file_handler = logging.handlers.RotatingFileHandler(
|
|
228
|
-
log_file,
|
|
228
|
+
log_file,
|
|
229
|
+
maxBytes=10 * 1024 * 1024,
|
|
230
|
+
backupCount=5, # 10 MB
|
|
229
231
|
)
|
|
230
232
|
else:
|
|
231
233
|
# Use default log directory
|
|
@@ -268,8 +268,47 @@ class OneshotSession:
|
|
|
268
268
|
if self.runner.claude_args:
|
|
269
269
|
cmd.extend(self.runner.claude_args)
|
|
270
270
|
|
|
271
|
+
# Add --agents flag if native agents mode is enabled
|
|
272
|
+
if getattr(self.runner, "use_native_agents", False):
|
|
273
|
+
agents_flag = self._build_agents_flag()
|
|
274
|
+
if agents_flag:
|
|
275
|
+
cmd.extend(agents_flag)
|
|
276
|
+
self.logger.info("✓ Native agents mode: Using --agents CLI flag")
|
|
277
|
+
|
|
271
278
|
return cmd
|
|
272
279
|
|
|
280
|
+
def _build_agents_flag(self) -> Optional[list]:
|
|
281
|
+
"""Build --agents flag with all MPM agents.
|
|
282
|
+
|
|
283
|
+
Returns:
|
|
284
|
+
List with ["--agents", "<json>"] or None if conversion fails
|
|
285
|
+
"""
|
|
286
|
+
try:
|
|
287
|
+
from claude_mpm.services.native_agent_converter import NativeAgentConverter
|
|
288
|
+
|
|
289
|
+
converter = NativeAgentConverter()
|
|
290
|
+
agents = converter.load_agents_from_templates()
|
|
291
|
+
|
|
292
|
+
if not agents:
|
|
293
|
+
self.logger.warning("No agents loaded for native mode")
|
|
294
|
+
return None
|
|
295
|
+
|
|
296
|
+
# Generate JSON for --agents flag
|
|
297
|
+
agents_json = converter.generate_agents_json(agents)
|
|
298
|
+
summary = converter.get_conversion_summary(agents)
|
|
299
|
+
|
|
300
|
+
self.logger.info(
|
|
301
|
+
f"Native agents: {summary['total_agents']} agents, "
|
|
302
|
+
f"{summary['json_size_kb']} KB JSON"
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
# Return as list: ["--agents", "<json>"]
|
|
306
|
+
return ["--agents", agents_json]
|
|
307
|
+
|
|
308
|
+
except Exception as e:
|
|
309
|
+
self.logger.error(f"Failed to build --agents flag: {e}", exc_info=True)
|
|
310
|
+
return None
|
|
311
|
+
|
|
273
312
|
def _handle_successful_response(self, response: str, prompt: str) -> None:
|
|
274
313
|
"""Process a successful Claude response."""
|
|
275
314
|
print(response)
|
|
@@ -236,7 +236,7 @@ class OptimizedAgentLoader:
|
|
|
236
236
|
|
|
237
237
|
self.metrics.total_time = time.time() - start_time
|
|
238
238
|
|
|
239
|
-
self.logger.
|
|
239
|
+
self.logger.debug(
|
|
240
240
|
f"Loaded {self.metrics.loaded_agents}/{self.metrics.total_agents} agents "
|
|
241
241
|
f"in {self.metrics.total_time:.2f}s "
|
|
242
242
|
f"(cache hits: {self.metrics.cache_hits}, misses: {self.metrics.cache_misses})"
|
|
@@ -286,7 +286,7 @@ class OptimizedAgentLoader:
|
|
|
286
286
|
|
|
287
287
|
self.metrics.total_time = time.time() - start_time
|
|
288
288
|
|
|
289
|
-
self.logger.
|
|
289
|
+
self.logger.debug(
|
|
290
290
|
f"Async loaded {self.metrics.loaded_agents}/{self.metrics.total_agents} agents "
|
|
291
291
|
f"in {self.metrics.total_time:.2f}s"
|
|
292
292
|
)
|
|
@@ -418,7 +418,7 @@ class OptimizedAgentLoader:
|
|
|
418
418
|
Args:
|
|
419
419
|
agent_dirs: List of directories containing agents
|
|
420
420
|
"""
|
|
421
|
-
self.logger.
|
|
421
|
+
self.logger.debug(f"Preloading agents from {len(agent_dirs)} directories")
|
|
422
422
|
|
|
423
423
|
all_paths = []
|
|
424
424
|
for dir_path in agent_dirs:
|