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,277 @@
|
|
|
1
|
+
"""CLI commands for managing hook error memory.
|
|
2
|
+
|
|
3
|
+
WHY this command is needed:
|
|
4
|
+
- Users need visibility into what hooks are failing
|
|
5
|
+
- Must be able to clear error memory to retry failed hooks
|
|
6
|
+
- Provides diagnostics for troubleshooting
|
|
7
|
+
- Makes error memory accessible without manual file editing
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
import click
|
|
14
|
+
|
|
15
|
+
from claude_mpm.core.hook_error_memory import get_hook_error_memory
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@click.group(name="hook-errors")
|
|
19
|
+
def hook_errors_group():
|
|
20
|
+
"""Manage hook error memory and diagnostics.
|
|
21
|
+
|
|
22
|
+
The hook error memory system tracks failing hooks to prevent
|
|
23
|
+
repeated execution of known-failing operations.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@hook_errors_group.command(name="list")
|
|
28
|
+
@click.option(
|
|
29
|
+
"--format",
|
|
30
|
+
type=click.Choice(["table", "json"], case_sensitive=False),
|
|
31
|
+
default="table",
|
|
32
|
+
help="Output format (table or json)",
|
|
33
|
+
)
|
|
34
|
+
@click.option(
|
|
35
|
+
"--hook-type",
|
|
36
|
+
help="Filter by hook type (e.g., PreToolUse, PostToolUse)",
|
|
37
|
+
)
|
|
38
|
+
def list_errors(format, hook_type):
|
|
39
|
+
"""List all recorded hook errors.
|
|
40
|
+
|
|
41
|
+
Shows errors that have been detected during hook execution,
|
|
42
|
+
including failure counts and last seen timestamps.
|
|
43
|
+
|
|
44
|
+
Examples:
|
|
45
|
+
claude-mpm hook-errors list
|
|
46
|
+
claude-mpm hook-errors list --format json
|
|
47
|
+
claude-mpm hook-errors list --hook-type PreToolUse
|
|
48
|
+
"""
|
|
49
|
+
error_memory = get_hook_error_memory()
|
|
50
|
+
|
|
51
|
+
# Filter errors if hook type specified
|
|
52
|
+
errors = error_memory.errors
|
|
53
|
+
if hook_type:
|
|
54
|
+
errors = {
|
|
55
|
+
key: data for key, data in errors.items() if data["hook_type"] == hook_type
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if not errors:
|
|
59
|
+
if hook_type:
|
|
60
|
+
click.echo(f"No errors recorded for hook type: {hook_type}")
|
|
61
|
+
else:
|
|
62
|
+
click.echo("No errors recorded. Hook system is healthy! ✅")
|
|
63
|
+
return
|
|
64
|
+
|
|
65
|
+
if format == "json":
|
|
66
|
+
# JSON output
|
|
67
|
+
click.echo(json.dumps(errors, indent=2))
|
|
68
|
+
else:
|
|
69
|
+
# Table output
|
|
70
|
+
click.echo("\n" + "=" * 80)
|
|
71
|
+
click.echo("Hook Error Memory Report")
|
|
72
|
+
click.echo("=" * 80)
|
|
73
|
+
|
|
74
|
+
for key, data in errors.items():
|
|
75
|
+
click.echo(f"\n🔴 Error: {data['type']}")
|
|
76
|
+
click.echo(f" Hook Type: {data['hook_type']}")
|
|
77
|
+
click.echo(f" Details: {data['details']}")
|
|
78
|
+
click.echo(f" Match: {data['match']}")
|
|
79
|
+
click.echo(f" Count: {data['count']} occurrences")
|
|
80
|
+
click.echo(f" First Seen: {data['first_seen']}")
|
|
81
|
+
click.echo(f" Last Seen: {data['last_seen']}")
|
|
82
|
+
|
|
83
|
+
click.echo("\n" + "=" * 80)
|
|
84
|
+
click.echo(f"Total unique errors: {len(errors)}")
|
|
85
|
+
click.echo(f"Memory file: {error_memory.memory_file}")
|
|
86
|
+
click.echo("\nTo clear errors: claude-mpm hook-errors clear")
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@hook_errors_group.command(name="summary")
|
|
90
|
+
def show_summary():
|
|
91
|
+
"""Show summary statistics of hook errors.
|
|
92
|
+
|
|
93
|
+
Provides overview of error counts by type and hook type.
|
|
94
|
+
|
|
95
|
+
Example:
|
|
96
|
+
claude-mpm hook-errors summary
|
|
97
|
+
"""
|
|
98
|
+
error_memory = get_hook_error_memory()
|
|
99
|
+
summary = error_memory.get_error_summary()
|
|
100
|
+
|
|
101
|
+
if summary["total_errors"] == 0:
|
|
102
|
+
click.echo("No errors recorded. Hook system is healthy! ✅")
|
|
103
|
+
return
|
|
104
|
+
|
|
105
|
+
click.echo("\n" + "=" * 80)
|
|
106
|
+
click.echo("Hook Error Summary")
|
|
107
|
+
click.echo("=" * 80)
|
|
108
|
+
click.echo("\n📊 Statistics:")
|
|
109
|
+
click.echo(f" Total Errors: {summary['total_errors']}")
|
|
110
|
+
click.echo(f" Unique Errors: {summary['unique_errors']}")
|
|
111
|
+
|
|
112
|
+
if summary["errors_by_type"]:
|
|
113
|
+
click.echo("\n🔍 Errors by Type:")
|
|
114
|
+
for error_type, count in summary["errors_by_type"].items():
|
|
115
|
+
click.echo(f" {error_type}: {count}")
|
|
116
|
+
|
|
117
|
+
if summary["errors_by_hook"]:
|
|
118
|
+
click.echo("\n🎣 Errors by Hook Type:")
|
|
119
|
+
for hook_type, count in summary["errors_by_hook"].items():
|
|
120
|
+
click.echo(f" {hook_type}: {count}")
|
|
121
|
+
|
|
122
|
+
click.echo(f"\n📁 Memory File: {summary['memory_file']}")
|
|
123
|
+
click.echo("\nFor detailed list: claude-mpm hook-errors list")
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
@hook_errors_group.command(name="clear")
|
|
127
|
+
@click.option(
|
|
128
|
+
"--hook-type",
|
|
129
|
+
help="Clear errors only for specific hook type",
|
|
130
|
+
)
|
|
131
|
+
@click.option(
|
|
132
|
+
"--yes",
|
|
133
|
+
"-y",
|
|
134
|
+
is_flag=True,
|
|
135
|
+
help="Skip confirmation prompt",
|
|
136
|
+
)
|
|
137
|
+
def clear_errors(hook_type, yes):
|
|
138
|
+
"""Clear hook error memory to allow retry.
|
|
139
|
+
|
|
140
|
+
This removes error records, allowing previously failing hooks
|
|
141
|
+
to be executed again. Use this after fixing the underlying issue.
|
|
142
|
+
|
|
143
|
+
Examples:
|
|
144
|
+
claude-mpm hook-errors clear
|
|
145
|
+
claude-mpm hook-errors clear --hook-type PreToolUse
|
|
146
|
+
claude-mpm hook-errors clear -y # Skip confirmation
|
|
147
|
+
"""
|
|
148
|
+
error_memory = get_hook_error_memory()
|
|
149
|
+
|
|
150
|
+
# Count errors to be cleared
|
|
151
|
+
if hook_type:
|
|
152
|
+
count = sum(
|
|
153
|
+
1 for data in error_memory.errors.values() if data["hook_type"] == hook_type
|
|
154
|
+
)
|
|
155
|
+
scope = f"for hook type '{hook_type}'"
|
|
156
|
+
else:
|
|
157
|
+
count = len(error_memory.errors)
|
|
158
|
+
scope = "all hook types"
|
|
159
|
+
|
|
160
|
+
if count == 0:
|
|
161
|
+
click.echo(f"No errors to clear {scope}.")
|
|
162
|
+
return
|
|
163
|
+
|
|
164
|
+
# Confirm if not using -y flag
|
|
165
|
+
if not yes:
|
|
166
|
+
message = f"Clear {count} error(s) {scope}?"
|
|
167
|
+
if not click.confirm(message):
|
|
168
|
+
click.echo("Cancelled.")
|
|
169
|
+
return
|
|
170
|
+
|
|
171
|
+
# Clear errors
|
|
172
|
+
error_memory.clear_errors(hook_type)
|
|
173
|
+
|
|
174
|
+
click.echo(f"✅ Cleared {count} error(s) {scope}.")
|
|
175
|
+
click.echo("\nHooks will be retried on next execution.")
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
@hook_errors_group.command(name="diagnose")
|
|
179
|
+
@click.argument("hook_type", required=False)
|
|
180
|
+
def diagnose_errors(hook_type):
|
|
181
|
+
"""Diagnose hook errors and suggest fixes.
|
|
182
|
+
|
|
183
|
+
Provides detailed diagnostics and actionable suggestions for
|
|
184
|
+
resolving hook errors.
|
|
185
|
+
|
|
186
|
+
Arguments:
|
|
187
|
+
HOOK_TYPE: Optional hook type to diagnose (e.g., PreToolUse)
|
|
188
|
+
|
|
189
|
+
Examples:
|
|
190
|
+
claude-mpm hook-errors diagnose
|
|
191
|
+
claude-mpm hook-errors diagnose PreToolUse
|
|
192
|
+
"""
|
|
193
|
+
error_memory = get_hook_error_memory()
|
|
194
|
+
|
|
195
|
+
# Filter errors if hook type specified
|
|
196
|
+
errors = error_memory.errors
|
|
197
|
+
if hook_type:
|
|
198
|
+
errors = {
|
|
199
|
+
key: data for key, data in errors.items() if data["hook_type"] == hook_type
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
if not errors:
|
|
203
|
+
if hook_type:
|
|
204
|
+
click.echo(f"No errors to diagnose for hook type: {hook_type}")
|
|
205
|
+
else:
|
|
206
|
+
click.echo("No errors to diagnose. Hook system is healthy! ✅")
|
|
207
|
+
return
|
|
208
|
+
|
|
209
|
+
click.echo("\n" + "=" * 80)
|
|
210
|
+
click.echo("Hook Error Diagnostics")
|
|
211
|
+
click.echo("=" * 80)
|
|
212
|
+
|
|
213
|
+
for key, data in errors.items():
|
|
214
|
+
click.echo(f"\n🔴 Error: {data['type']}")
|
|
215
|
+
click.echo(f" Hook: {data['hook_type']}")
|
|
216
|
+
click.echo(f" Count: {data['count']} failures")
|
|
217
|
+
|
|
218
|
+
# Generate and show fix suggestion
|
|
219
|
+
error_info = {
|
|
220
|
+
"type": data["type"],
|
|
221
|
+
"details": data["details"],
|
|
222
|
+
"match": data["match"],
|
|
223
|
+
}
|
|
224
|
+
suggestion = error_memory.suggest_fix(error_info)
|
|
225
|
+
|
|
226
|
+
click.echo("\n" + "-" * 80)
|
|
227
|
+
click.echo(suggestion)
|
|
228
|
+
click.echo("-" * 80)
|
|
229
|
+
|
|
230
|
+
click.echo("\n" + "=" * 80)
|
|
231
|
+
click.echo("After fixing issues, clear errors to retry:")
|
|
232
|
+
click.echo(" claude-mpm hook-errors clear")
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
@hook_errors_group.command(name="status")
|
|
236
|
+
def show_status():
|
|
237
|
+
"""Show hook error memory status.
|
|
238
|
+
|
|
239
|
+
Quick overview of hook error system state.
|
|
240
|
+
|
|
241
|
+
Example:
|
|
242
|
+
claude-mpm hook-errors status
|
|
243
|
+
"""
|
|
244
|
+
error_memory = get_hook_error_memory()
|
|
245
|
+
summary = error_memory.get_error_summary()
|
|
246
|
+
|
|
247
|
+
click.echo("\n📊 Hook Error Memory Status")
|
|
248
|
+
click.echo("=" * 80)
|
|
249
|
+
|
|
250
|
+
if summary["total_errors"] == 0:
|
|
251
|
+
click.echo("✅ Status: Healthy (no errors recorded)")
|
|
252
|
+
else:
|
|
253
|
+
click.echo(f"⚠️ Status: {summary['total_errors']} error(s) recorded")
|
|
254
|
+
click.echo(f" Unique errors: {summary['unique_errors']}")
|
|
255
|
+
|
|
256
|
+
# Show which hooks are affected
|
|
257
|
+
if summary["errors_by_hook"]:
|
|
258
|
+
affected_hooks = list(summary["errors_by_hook"].keys())
|
|
259
|
+
click.echo(f" Affected hooks: {', '.join(affected_hooks)}")
|
|
260
|
+
|
|
261
|
+
click.echo(f"\n📁 Memory file: {summary['memory_file']}")
|
|
262
|
+
click.echo(f" Exists: {Path(summary['memory_file']).exists()}")
|
|
263
|
+
|
|
264
|
+
click.echo("\nCommands:")
|
|
265
|
+
click.echo(" claude-mpm hook-errors list # View detailed errors")
|
|
266
|
+
click.echo(" claude-mpm hook-errors diagnose # Get fix suggestions")
|
|
267
|
+
click.echo(" claude-mpm hook-errors clear # Clear and retry")
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
# Register the command group
|
|
271
|
+
def register_commands(cli):
|
|
272
|
+
"""Register hook error commands with CLI.
|
|
273
|
+
|
|
274
|
+
Args:
|
|
275
|
+
cli: Click CLI group to register commands with
|
|
276
|
+
"""
|
|
277
|
+
cli.add_command(hook_errors_group)
|
|
@@ -295,7 +295,7 @@ class MCPInstallCommands:
|
|
|
295
295
|
|
|
296
296
|
# Create backup
|
|
297
297
|
backup_path = config_path.with_suffix(
|
|
298
|
-
f
|
|
298
|
+
f".backup.{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}.json"
|
|
299
299
|
)
|
|
300
300
|
try:
|
|
301
301
|
config_path.rename(backup_path)
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"""MCP install command implementations.
|
|
2
|
+
|
|
3
|
+
This module provides MCP installation and configuration commands.
|
|
4
|
+
Extracted from mcp.py to reduce complexity and improve maintainability.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import subprocess
|
|
8
|
+
import sys
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class MCPInstallCommands:
|
|
13
|
+
"""Handles MCP install commands."""
|
|
14
|
+
|
|
15
|
+
def __init__(self, logger):
|
|
16
|
+
"""Initialize the MCP install commands handler."""
|
|
17
|
+
self.logger = logger
|
|
18
|
+
|
|
19
|
+
def install_gateway(self, args):
|
|
20
|
+
"""Install and configure MCP gateway.
|
|
21
|
+
|
|
22
|
+
WHY: This command installs the MCP package dependencies and configures
|
|
23
|
+
Claude Code to use the MCP gateway server directly via the CLI command.
|
|
24
|
+
|
|
25
|
+
DESIGN DECISION: We handle both package installation and configuration
|
|
26
|
+
in one command for user convenience, using the new direct CLI approach.
|
|
27
|
+
"""
|
|
28
|
+
self.logger.info("MCP gateway installation command called")
|
|
29
|
+
print("📦 Installing and Configuring MCP Gateway")
|
|
30
|
+
print("=" * 50)
|
|
31
|
+
|
|
32
|
+
# Step 1: Install MCP package if needed
|
|
33
|
+
print("\n1️⃣ Checking MCP package installation...")
|
|
34
|
+
try:
|
|
35
|
+
import mcp
|
|
36
|
+
print("✅ MCP package already installed")
|
|
37
|
+
except ImportError:
|
|
38
|
+
print("📦 Installing MCP package...")
|
|
39
|
+
try:
|
|
40
|
+
subprocess.check_call([sys.executable, "-m", "pip", "install", "mcp"])
|
|
41
|
+
print("✅ MCP package installed successfully")
|
|
42
|
+
except subprocess.CalledProcessError as e:
|
|
43
|
+
print(f"❌ Error installing MCP package: {e}")
|
|
44
|
+
print("\nPlease install manually with: pip install mcp")
|
|
45
|
+
return 1
|
|
46
|
+
|
|
47
|
+
# Step 2: Configure Claude Code with the new CLI command
|
|
48
|
+
print("\n2️⃣ Configuring Claude Code...")
|
|
49
|
+
try:
|
|
50
|
+
success = self._configure_claude_desktop(args.force)
|
|
51
|
+
if success:
|
|
52
|
+
print("✅ Configuration completed successfully")
|
|
53
|
+
print("\n🎉 MCP Gateway is ready to use!")
|
|
54
|
+
print("\nNext steps:")
|
|
55
|
+
print("1. Restart Claude Code")
|
|
56
|
+
print("2. Test the server: claude-mpm mcp server --test")
|
|
57
|
+
print("3. Check status: claude-mpm mcp status")
|
|
58
|
+
return 0
|
|
59
|
+
else:
|
|
60
|
+
print("❌ Configuration failed")
|
|
61
|
+
return 1
|
|
62
|
+
|
|
63
|
+
except Exception as e:
|
|
64
|
+
print(f"❌ Error during configuration: {e}")
|
|
65
|
+
return 1
|
|
66
|
+
|
|
67
|
+
def _configure_claude_desktop(self, force=False):
|
|
68
|
+
"""Configure Claude Code to use the MCP gateway via CLI command.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
force: Whether to overwrite existing configuration
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
bool: True if configuration was successful
|
|
75
|
+
"""
|
|
76
|
+
import json
|
|
77
|
+
import platform
|
|
78
|
+
from pathlib import Path
|
|
79
|
+
from datetime import datetime
|
|
80
|
+
|
|
81
|
+
# Determine Claude Code config path
|
|
82
|
+
config_path = self._get_claude_config_path()
|
|
83
|
+
if not config_path:
|
|
84
|
+
print("❌ Could not determine Claude Code configuration path")
|
|
85
|
+
return False
|
|
86
|
+
|
|
87
|
+
print(f" Configuration path: {config_path}")
|
|
88
|
+
|
|
89
|
+
# Load existing configuration or create new one
|
|
90
|
+
config = self._load_or_create_config(config_path, force)
|
|
91
|
+
if config is None:
|
|
92
|
+
return False
|
|
93
|
+
|
|
94
|
+
# Configure the claude-mpm-gateway server using the CLI command
|
|
95
|
+
claude_mpm_path = self._find_claude_mpm_executable()
|
|
96
|
+
if not claude_mpm_path:
|
|
97
|
+
print("❌ Could not find claude-mpm executable")
|
|
98
|
+
return False
|
|
99
|
+
|
|
100
|
+
# Determine if we need to use -m claude_mpm or direct command
|
|
101
|
+
if claude_mpm_path.endswith(('python', 'python3', 'python.exe', 'python3.exe')):
|
|
102
|
+
# Using Python interpreter directly
|
|
103
|
+
mcp_config = {
|
|
104
|
+
"command": claude_mpm_path,
|
|
105
|
+
"args": ["-m", "claude_mpm", "mcp", "server"],
|
|
106
|
+
"env": {
|
|
107
|
+
"PYTHONPATH": str(Path(__file__).parent.parent.parent.parent),
|
|
108
|
+
"MCP_MODE": "production"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else:
|
|
112
|
+
# Using installed claude-mpm command
|
|
113
|
+
mcp_config = {
|
|
114
|
+
"command": claude_mpm_path,
|
|
115
|
+
"args": ["mcp", "server"],
|
|
116
|
+
"env": {
|
|
117
|
+
"PYTHONPATH": str(Path(__file__).parent.parent.parent.parent),
|
|
118
|
+
"MCP_MODE": "production"
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
# Update configuration
|
|
123
|
+
if "mcpServers" not in config:
|
|
124
|
+
config["mcpServers"] = {}
|
|
125
|
+
|
|
126
|
+
config["mcpServers"]["claude-mpm-gateway"] = mcp_config
|
|
127
|
+
|
|
128
|
+
print("\n✅ Configured claude-mpm-gateway server:")
|
|
129
|
+
print(f" Command: {mcp_config['command']}")
|
|
130
|
+
print(f" Args: {mcp_config['args']}")
|
|
131
|
+
print(f" Environment variables: {list(mcp_config['env'].keys())}")
|
|
132
|
+
|
|
133
|
+
# Save configuration
|
|
134
|
+
return self._save_config(config, config_path)
|
|
135
|
+
|
|
136
|
+
def _get_claude_config_path(self):
|
|
137
|
+
"""Get the Claude Code configuration file path.
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
Path or None: Path to Claude Code config file
|
|
141
|
+
"""
|
|
142
|
+
from pathlib import Path
|
|
143
|
+
|
|
144
|
+
# Claude Code uses ~/.claude/settings.local.json regardless of platform
|
|
145
|
+
return Path.home() / ".claude" / "settings.local.json"
|
|
146
|
+
|
|
147
|
+
def _find_claude_mpm_executable(self):
|
|
148
|
+
"""Find the claude-mpm executable path.
|
|
149
|
+
|
|
150
|
+
WHY: We need to find the installed claude-mpm command to use as the
|
|
151
|
+
MCP server command. This ensures we're using the properly installed
|
|
152
|
+
version with all dependencies, not a raw Python script.
|
|
153
|
+
|
|
154
|
+
DESIGN DECISION: We prioritize in this order:
|
|
155
|
+
1. System-installed claude-mpm (most reliable)
|
|
156
|
+
2. Virtual environment claude-mpm (development)
|
|
157
|
+
3. Python module invocation (fallback)
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
str or None: Path to claude-mpm executable
|
|
161
|
+
"""
|
|
162
|
+
import shutil
|
|
163
|
+
import sys
|
|
164
|
+
import os
|
|
165
|
+
|
|
166
|
+
# 1. Try to find claude-mpm in PATH (system-wide or venv)
|
|
167
|
+
claude_mpm_path = shutil.which("claude-mpm")
|
|
168
|
+
if claude_mpm_path:
|
|
169
|
+
print(f" Found claude-mpm: {claude_mpm_path}")
|
|
170
|
+
return claude_mpm_path
|
|
171
|
+
|
|
172
|
+
# 2. Check if we're in a virtual environment
|
|
173
|
+
if hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix):
|
|
174
|
+
# We're in a virtual environment
|
|
175
|
+
venv_bin = Path(sys.prefix) / ("Scripts" if sys.platform == "win32" else "bin")
|
|
176
|
+
venv_claude_mpm = venv_bin / "claude-mpm"
|
|
177
|
+
if venv_claude_mpm.exists():
|
|
178
|
+
print(f" Found claude-mpm in venv: {venv_claude_mpm}")
|
|
179
|
+
return str(venv_claude_mpm)
|
|
180
|
+
|
|
181
|
+
# 3. Check if claude_mpm module is installed and use Python to run it
|
|
182
|
+
try:
|
|
183
|
+
import claude_mpm
|
|
184
|
+
# Return the Python executable - we'll handle the -m args separately
|
|
185
|
+
print(f" Using Python module: {sys.executable} -m claude_mpm")
|
|
186
|
+
return sys.executable
|
|
187
|
+
except ImportError:
|
|
188
|
+
pass
|
|
189
|
+
|
|
190
|
+
# 4. Last resort: check project's local venv (development mode)
|
|
191
|
+
project_root = Path(__file__).parent.parent.parent.parent.parent
|
|
192
|
+
local_venv_bin = project_root / "venv" / ("Scripts" if sys.platform == "win32" else "bin")
|
|
193
|
+
local_claude_mpm = local_venv_bin / "claude-mpm"
|
|
194
|
+
if local_claude_mpm.exists():
|
|
195
|
+
print(f" Found claude-mpm in project venv: {local_claude_mpm}")
|
|
196
|
+
return str(local_claude_mpm)
|
|
197
|
+
|
|
198
|
+
return None
|
|
199
|
+
|
|
200
|
+
def _load_or_create_config(self, config_path, force=False):
|
|
201
|
+
"""Load existing configuration or create a new one.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
config_path: Path to configuration file
|
|
205
|
+
force: Whether to overwrite existing configuration
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
dict or None: Configuration dictionary
|
|
209
|
+
"""
|
|
210
|
+
import json
|
|
211
|
+
from datetime import datetime
|
|
212
|
+
|
|
213
|
+
config = {}
|
|
214
|
+
|
|
215
|
+
if config_path.exists():
|
|
216
|
+
if not force:
|
|
217
|
+
# Check if claude-mpm-gateway already exists
|
|
218
|
+
try:
|
|
219
|
+
with open(config_path, 'r') as f:
|
|
220
|
+
existing_config = json.load(f)
|
|
221
|
+
|
|
222
|
+
if (existing_config.get("mcpServers", {}).get("claude-mpm-gateway") and
|
|
223
|
+
not force):
|
|
224
|
+
print("⚠️ claude-mpm-gateway is already configured")
|
|
225
|
+
response = input("Do you want to overwrite it? (y/N): ").strip().lower()
|
|
226
|
+
if response not in ['y', 'yes']:
|
|
227
|
+
print("❌ Configuration cancelled")
|
|
228
|
+
return None
|
|
229
|
+
|
|
230
|
+
config = existing_config
|
|
231
|
+
|
|
232
|
+
except (json.JSONDecodeError, IOError) as e:
|
|
233
|
+
print(f"⚠️ Error reading existing config: {e}")
|
|
234
|
+
print("Creating backup and starting fresh...")
|
|
235
|
+
|
|
236
|
+
# Create backup
|
|
237
|
+
backup_path = config_path.with_suffix(f'.backup.{datetime.now().strftime("%Y%m%d_%H%M%S")}.json')
|
|
238
|
+
try:
|
|
239
|
+
config_path.rename(backup_path)
|
|
240
|
+
print(f" Backup created: {backup_path}")
|
|
241
|
+
except Exception as backup_error:
|
|
242
|
+
print(f" Warning: Could not create backup: {backup_error}")
|
|
243
|
+
else:
|
|
244
|
+
# Force mode - create backup but proceed
|
|
245
|
+
try:
|
|
246
|
+
with open(config_path, 'r') as f:
|
|
247
|
+
existing_config = json.load(f)
|
|
248
|
+
config = existing_config
|
|
249
|
+
print(" Force mode: Overwriting existing configuration")
|
|
250
|
+
except:
|
|
251
|
+
pass # File doesn't exist or is invalid, start fresh
|
|
252
|
+
|
|
253
|
+
# Ensure mcpServers section exists
|
|
254
|
+
if "mcpServers" not in config:
|
|
255
|
+
config["mcpServers"] = {}
|
|
256
|
+
|
|
257
|
+
return config
|
|
258
|
+
|
|
259
|
+
def _save_config(self, config, config_path):
|
|
260
|
+
"""Save configuration to file.
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
config: Configuration dictionary
|
|
264
|
+
config_path: Path to save configuration
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
bool: True if successful
|
|
268
|
+
"""
|
|
269
|
+
import json
|
|
270
|
+
|
|
271
|
+
try:
|
|
272
|
+
# Ensure directory exists
|
|
273
|
+
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
274
|
+
|
|
275
|
+
# Write configuration with nice formatting
|
|
276
|
+
with open(config_path, 'w') as f:
|
|
277
|
+
json.dump(config, f, indent=2)
|
|
278
|
+
|
|
279
|
+
print(f"\n✅ Configuration saved to {config_path}")
|
|
280
|
+
return True
|
|
281
|
+
|
|
282
|
+
except Exception as e:
|
|
283
|
+
print(f"❌ Error saving configuration: {e}")
|
|
284
|
+
return False
|