claude-mpm 4.20.3__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_PM.md +23 -6
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +1783 -34
- claude_mpm/agents/WORKFLOW.md +75 -2
- 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/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/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/security.json +4 -4
- 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/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 +522 -34
- claude_mpm/cli/executor.py +56 -0
- claude_mpm/cli/interactive/agent_wizard.py +5 -5
- claude_mpm/cli/parsers/base_parser.py +28 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
- claude_mpm/cli/parsers/skills_parser.py +138 -0
- claude_mpm/cli/startup.py +111 -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-help.md +3 -0
- claude_mpm/commands/mpm-init.md +19 -3
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm.md +1 -0
- claude_mpm/config/agent_capabilities.yaml +658 -0
- claude_mpm/config/async_logging_config.yaml +145 -0
- claude_mpm/constants.py +12 -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 +8 -0
- claude_mpm/core/constants.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/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/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/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/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/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- 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 +3 -1
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +36 -16
- 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/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/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_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/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/version_control/VERSION +1 -0
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +3 -3
- claude_mpm/skills/agent_skills_injector.py +42 -49
- claude_mpm/skills/bundled/.gitkeep +2 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +4 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +108 -114
- 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 +46 -41
- 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 +36 -73
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +100 -125
- 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/verification-before-completion/SKILL.md +28 -72
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +11 -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 +272 -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/main/artifacts-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +13 -1
- 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 +11 -0
- claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +109 -277
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
- 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 +135 -155
- 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 +13 -12
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
- claude_mpm/skills/bundled/performance-profiling.md +6 -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/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/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +21 -25
- 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-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 +86 -250
- 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 +145 -57
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
- 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 +37 -15
- 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/skills_registry.py +44 -48
- claude_mpm/skills/skills_service.py +117 -108
- 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 +3 -3
- 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.20.3.dist-info → claude_mpm-4.25.10.dist-info}/METADATA +218 -31
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +409 -246
- 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 -2093
- 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/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- /claude_mpm/skills/bundled/collaboration/requesting-code-review/{code-reviewer.md → references/code-reviewer-template.md} +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
|
|
16
16
|
<!-- External Dependencies -->
|
|
17
17
|
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
<!-- D3.js for Activity Tree Visualization -->
|
|
20
20
|
<script src="https://d3js.org/d3.v7.min.js"></script>
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
<!-- Font Awesome for icons -->
|
|
23
23
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
|
24
24
|
|
|
@@ -141,7 +141,7 @@
|
|
|
141
141
|
<body>
|
|
142
142
|
<!-- Connection Notifications Area -->
|
|
143
143
|
<div id="connection-notifications" class="connection-notifications"></div>
|
|
144
|
-
|
|
144
|
+
|
|
145
145
|
<div class="container">
|
|
146
146
|
<!-- Header Section -->
|
|
147
147
|
<div class="header">
|
|
@@ -435,19 +435,19 @@
|
|
|
435
435
|
// Set up working directory environment variables
|
|
436
436
|
// These will be used by the working-directory component
|
|
437
437
|
// The server will inject these values through a separate API call
|
|
438
|
-
|
|
438
|
+
|
|
439
439
|
// Get the current working directory from the server
|
|
440
440
|
fetch('/api/working-directory')
|
|
441
441
|
.then(response => response.json())
|
|
442
442
|
.then(data => {
|
|
443
443
|
window.processWorkingDirectory = data.working_directory || '/Users/masa/Projects/claude-mpm';
|
|
444
444
|
window.homeDirectory = data.home_directory || '/Users/masa';
|
|
445
|
-
|
|
445
|
+
|
|
446
446
|
// Store in session storage for persistence
|
|
447
447
|
if (window.processWorkingDirectory && window.processWorkingDirectory !== '/') {
|
|
448
448
|
sessionStorage.setItem('currentWorkingDirectory', window.processWorkingDirectory);
|
|
449
449
|
}
|
|
450
|
-
|
|
450
|
+
|
|
451
451
|
// Dispatch event to notify components that working directory is ready
|
|
452
452
|
window.dispatchEvent(new CustomEvent('workingDirectoryInitialized', {
|
|
453
453
|
detail: {
|
|
@@ -462,10 +462,10 @@
|
|
|
462
462
|
window.processWorkingDirectory = '/Users/masa/Projects/claude-mpm';
|
|
463
463
|
window.homeDirectory = '/Users/masa';
|
|
464
464
|
});
|
|
465
|
-
|
|
465
|
+
|
|
466
466
|
// Add timestamp-based cache busting and ensure proper loading order
|
|
467
467
|
const timestamp = Date.now();
|
|
468
|
-
|
|
468
|
+
|
|
469
469
|
// Load modules sequentially to ensure dashboard.js loads first
|
|
470
470
|
const loadModule = (src) => {
|
|
471
471
|
return new Promise((resolve, reject) => {
|
|
@@ -477,7 +477,7 @@
|
|
|
477
477
|
document.body.appendChild(script);
|
|
478
478
|
});
|
|
479
479
|
};
|
|
480
|
-
|
|
480
|
+
|
|
481
481
|
// Load shared services first, then components
|
|
482
482
|
// Load services sequentially to ensure dependencies are available
|
|
483
483
|
loadModule('/static/js/shared/tooltip-service.js')
|
|
@@ -540,21 +540,21 @@
|
|
|
540
540
|
console.error('[CRITICAL] Error loading dashboard modules:', error);
|
|
541
541
|
console.error('Stack trace:', error.stack);
|
|
542
542
|
});
|
|
543
|
-
|
|
543
|
+
|
|
544
544
|
// Give modules time to execute and initialize dashboard
|
|
545
545
|
setTimeout(() => {
|
|
546
546
|
console.log('Checking dashboard initialization...');
|
|
547
|
-
|
|
547
|
+
|
|
548
548
|
if (window.dashboard) {
|
|
549
549
|
console.log('Dashboard found, checking auto-connect status...');
|
|
550
|
-
|
|
550
|
+
|
|
551
551
|
// Force auto-connect if not already connected
|
|
552
552
|
if (window.dashboard.socketManager) {
|
|
553
553
|
const socketManager = window.dashboard.socketManager;
|
|
554
|
-
|
|
554
|
+
|
|
555
555
|
if (!socketManager.isConnected() && !socketManager.isConnecting()) {
|
|
556
556
|
console.log('Dashboard loaded but not connected, forcing auto-connect...');
|
|
557
|
-
|
|
557
|
+
|
|
558
558
|
// Try to trigger auto-connect manually
|
|
559
559
|
const params = new URLSearchParams(window.location.search);
|
|
560
560
|
socketManager.initializeFromURL(params);
|
|
@@ -566,23 +566,23 @@
|
|
|
566
566
|
}
|
|
567
567
|
} else {
|
|
568
568
|
console.warn('Dashboard still not initialized after module loading');
|
|
569
|
-
|
|
569
|
+
|
|
570
570
|
// Try to manually trigger initialization
|
|
571
571
|
if (document.readyState === 'complete' || document.readyState === 'interactive') {
|
|
572
572
|
console.log('Document ready, attempting to trigger dashboard initialization...');
|
|
573
573
|
document.dispatchEvent(new Event('DOMContentLoaded'));
|
|
574
574
|
}
|
|
575
575
|
}
|
|
576
|
-
|
|
576
|
+
|
|
577
577
|
// Debug: Test connection settings button
|
|
578
578
|
const connectionToggleBtn = document.getElementById('connection-toggle-btn');
|
|
579
579
|
if (connectionToggleBtn) {
|
|
580
580
|
console.log('Connection toggle button found, testing functionality...');
|
|
581
|
-
|
|
581
|
+
|
|
582
582
|
// Add a debug click handler to ensure the button works
|
|
583
583
|
connectionToggleBtn.addEventListener('click', () => {
|
|
584
584
|
console.log('Connection toggle button clicked (debug handler)');
|
|
585
|
-
|
|
585
|
+
|
|
586
586
|
if (window.dashboard && window.dashboard.socketManager) {
|
|
587
587
|
console.log('Calling socketManager.toggleConnectionControls()');
|
|
588
588
|
window.dashboard.socketManager.toggleConnectionControls();
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Claude Code Hooks System
|
|
2
|
+
|
|
3
|
+
This directory contains the Claude Code hook integration for claude-mpm.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The hook system allows claude-mpm to intercept and handle commands typed in Claude Code, particularly the `/mpm` commands.
|
|
8
|
+
|
|
9
|
+
## Version Requirements
|
|
10
|
+
|
|
11
|
+
**Claude Code 1.0.92 or higher is required for hook monitoring features.**
|
|
12
|
+
|
|
13
|
+
Earlier versions of Claude Code do not support the matcher-based hook configuration format needed for real-time event monitoring. If you have an older version:
|
|
14
|
+
- The dashboard and other features will still work
|
|
15
|
+
- Real-time monitoring will not be available
|
|
16
|
+
- You'll see a clear message about the version requirement
|
|
17
|
+
- To enable monitoring, upgrade Claude Code to 1.0.92+
|
|
18
|
+
|
|
19
|
+
**Claude Code 2.0.30 or higher is required for PreToolUse input modification.**
|
|
20
|
+
|
|
21
|
+
This advanced feature allows hooks to modify tool inputs before execution, enabling:
|
|
22
|
+
- Context injection into file operations
|
|
23
|
+
- Security guards that validate and block dangerous operations
|
|
24
|
+
- Parameter enhancement with default values
|
|
25
|
+
- Logging and auditing of tool invocations
|
|
26
|
+
|
|
27
|
+
See [PreToolUse Hook Documentation](../../docs/developer/pretool-use-hooks.md) for details.
|
|
28
|
+
|
|
29
|
+
## Architecture (v4.1.8+)
|
|
30
|
+
|
|
31
|
+
Claude MPM uses a **deployment-root hook architecture** where Claude Code directly calls a script within the claude-mpm installation. See [HOOK_ARCHITECTURE.md](../../docs/developer/HOOK_ARCHITECTURE.md) for details.
|
|
32
|
+
|
|
33
|
+
## Structure
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
hooks/
|
|
37
|
+
├── claude_hooks/ # Claude Code hook implementation
|
|
38
|
+
│ ├── hook_handler.py # Main Python handler that processes events
|
|
39
|
+
│ ├── installer.py # Hook installation and configuration
|
|
40
|
+
│ ├── event_handlers.py # Event processing logic
|
|
41
|
+
│ ├── memory_integration.py # Memory system integration
|
|
42
|
+
│ ├── response_tracking.py # Response tracking
|
|
43
|
+
│ └── services/ # Service modules
|
|
44
|
+
│ ├── connection_manager.py # SocketIO/HTTP connections
|
|
45
|
+
│ ├── state_manager.py # State and delegation tracking
|
|
46
|
+
│ └── subagent_processor.py # Subagent response processing
|
|
47
|
+
├── templates/ # Hook script templates
|
|
48
|
+
│ ├── pre_tool_use_template.py # Comprehensive PreToolUse template
|
|
49
|
+
│ ├── pre_tool_use_simple.py # Simple PreToolUse template
|
|
50
|
+
│ └── README.md # Template documentation
|
|
51
|
+
└── scripts/
|
|
52
|
+
└── claude-hook-handler.sh # Deployment-root hook script (called by Claude Code)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Claude Code Hooks
|
|
56
|
+
|
|
57
|
+
The Claude Code hooks are the primary integration point between claude-mpm and Claude Code. They allow:
|
|
58
|
+
|
|
59
|
+
- Intercepting `/mpm` commands before they reach the LLM
|
|
60
|
+
- Providing custom responses and actions
|
|
61
|
+
- Blocking LLM processing when appropriate
|
|
62
|
+
|
|
63
|
+
### Installation
|
|
64
|
+
|
|
65
|
+
To install the Claude Code hooks:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Using the configure command (recommended)
|
|
69
|
+
claude-mpm configure --install-hooks
|
|
70
|
+
|
|
71
|
+
# Or check your version compatibility first
|
|
72
|
+
claude-mpm configure --verify-hooks
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
This will:
|
|
76
|
+
1. Check your Claude Code version for compatibility
|
|
77
|
+
2. If compatible (1.0.92+), create/update `~/.claude/settings.json` with hook configuration
|
|
78
|
+
3. Install the smart hook script that dynamically finds claude-mpm
|
|
79
|
+
4. Copy any custom commands to `~/.claude/commands/`
|
|
80
|
+
|
|
81
|
+
If your Claude Code version is older than 1.0.92:
|
|
82
|
+
- You'll see a message explaining the version requirement
|
|
83
|
+
- Hooks will not be installed to prevent configuration errors
|
|
84
|
+
- The system will continue to work without real-time monitoring
|
|
85
|
+
|
|
86
|
+
### How It Works
|
|
87
|
+
|
|
88
|
+
1. When you type in Claude Code, it triggers hook events
|
|
89
|
+
2. Claude Code calls `hook_wrapper.sh` (the path in `~/.claude/settings.json`)
|
|
90
|
+
3. The wrapper script:
|
|
91
|
+
- Detects if it's running from a local dev environment, npm, or PyPI installation
|
|
92
|
+
- Activates the appropriate Python environment
|
|
93
|
+
- Runs `hook_handler.py` with the event data
|
|
94
|
+
4. The handler processes various event types:
|
|
95
|
+
- **UserPromptSubmit**: Checks if the prompt starts with `/mpm` and handles commands
|
|
96
|
+
- **PreToolUse**: Logs tool usage before execution
|
|
97
|
+
- **PostToolUse**: Logs tool results after execution
|
|
98
|
+
- **Stop**: Logs when a session or task stops
|
|
99
|
+
- **SubagentStop**: Logs when a subagent completes with agent type and ID
|
|
100
|
+
5. For `/mpm` commands, it returns exit code 2 to block LLM processing
|
|
101
|
+
6. All events are logged to project-specific log files in `.claude-mpm/logs/`
|
|
102
|
+
|
|
103
|
+
### Available Commands
|
|
104
|
+
|
|
105
|
+
- `/mpm` - Show help and available commands
|
|
106
|
+
- `/mpm status` - Show claude-mpm status and environment
|
|
107
|
+
- `/mpm help` - Show detailed help
|
|
108
|
+
|
|
109
|
+
### Debugging
|
|
110
|
+
|
|
111
|
+
To enable debug logging for hooks:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
export CLAUDE_MPM_LOG_LEVEL=DEBUG
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Then run Claude Code from that terminal. Hook events will be logged to `~/.claude-mpm/logs/`.
|
|
118
|
+
|
|
119
|
+
## Legacy Hook System (Removed)
|
|
120
|
+
|
|
121
|
+
The `builtin/` directory that contained the old internal hook system has been removed. All hook functionality is now handled through the Claude Code hooks system.
|
|
122
|
+
|
|
123
|
+
## Development
|
|
124
|
+
|
|
125
|
+
To add new `/mpm` commands:
|
|
126
|
+
|
|
127
|
+
1. Edit `hook_handler.py` to handle the new command
|
|
128
|
+
2. Update the help text in the `handle_mpm_help()` function
|
|
129
|
+
3. Test by running Claude Code with the new command
|
|
130
|
+
|
|
131
|
+
## Exit Codes
|
|
132
|
+
|
|
133
|
+
The hook system uses specific exit codes:
|
|
134
|
+
|
|
135
|
+
- `0` - Success, continue normal processing
|
|
136
|
+
- `2` - Block LLM processing (command was handled)
|
|
137
|
+
- Other - Error occurred
|
|
138
|
+
|
|
139
|
+
## Environment Variables
|
|
140
|
+
|
|
141
|
+
- `CLAUDE_MPM_LOG_LEVEL` - Set to DEBUG for detailed logging
|
|
142
|
+
- `HOOK_EVENT_TYPE` - Set by Claude Code (UserPromptSubmit, PreToolUse, PostToolUse)
|
|
143
|
+
- `HOOK_DATA` - JSON data from Claude Code with event details
|
|
@@ -393,7 +393,9 @@ class EventHandlers:
|
|
|
393
393
|
"status": (
|
|
394
394
|
"success"
|
|
395
395
|
if exit_code == 0
|
|
396
|
-
else "blocked"
|
|
396
|
+
else "blocked"
|
|
397
|
+
if exit_code == 2
|
|
398
|
+
else "error"
|
|
397
399
|
),
|
|
398
400
|
"duration_ms": duration,
|
|
399
401
|
"result_summary": result_data,
|
|
@@ -311,11 +311,12 @@ class ClaudeHookHandler:
|
|
|
311
311
|
)
|
|
312
312
|
|
|
313
313
|
# Route event to appropriate handler
|
|
314
|
-
|
|
314
|
+
# Handlers can optionally return modified input for PreToolUse events
|
|
315
|
+
modified_input = self._route_event(event)
|
|
315
316
|
|
|
316
317
|
# Always continue execution (only if not already sent)
|
|
317
318
|
if not _continue_sent:
|
|
318
|
-
self._continue_execution()
|
|
319
|
+
self._continue_execution(modified_input)
|
|
319
320
|
_continue_sent = True
|
|
320
321
|
|
|
321
322
|
except Exception:
|
|
@@ -376,7 +377,7 @@ class ClaudeHookHandler:
|
|
|
376
377
|
print(f"Error reading hook event: {e}", file=sys.stderr)
|
|
377
378
|
return None
|
|
378
379
|
|
|
379
|
-
def _route_event(self, event: dict) ->
|
|
380
|
+
def _route_event(self, event: dict) -> Optional[dict]:
|
|
380
381
|
"""
|
|
381
382
|
Route event to appropriate handler based on type.
|
|
382
383
|
|
|
@@ -385,6 +386,9 @@ class ClaudeHookHandler:
|
|
|
385
386
|
|
|
386
387
|
Args:
|
|
387
388
|
event: Hook event dictionary
|
|
389
|
+
|
|
390
|
+
Returns:
|
|
391
|
+
Modified input for PreToolUse events (v2.0.30+), None otherwise
|
|
388
392
|
"""
|
|
389
393
|
# Try multiple field names for compatibility
|
|
390
394
|
hook_type = (
|
|
@@ -416,23 +420,36 @@ class ClaudeHookHandler:
|
|
|
416
420
|
handler = event_handlers.get(hook_type)
|
|
417
421
|
if handler:
|
|
418
422
|
try:
|
|
419
|
-
|
|
423
|
+
# Handlers can optionally return modified input
|
|
424
|
+
result = handler(event)
|
|
425
|
+
# Only PreToolUse handlers should return modified input
|
|
426
|
+
if hook_type == "PreToolUse" and result is not None:
|
|
427
|
+
return result
|
|
420
428
|
except Exception as e:
|
|
421
429
|
if DEBUG:
|
|
422
430
|
print(f"Error handling {hook_type}: {e}", file=sys.stderr)
|
|
423
431
|
|
|
432
|
+
return None
|
|
433
|
+
|
|
424
434
|
def handle_subagent_stop(self, event: dict):
|
|
425
435
|
"""Delegate subagent stop processing to the specialized processor."""
|
|
426
436
|
self.subagent_processor.process_subagent_stop(event)
|
|
427
437
|
|
|
428
|
-
def _continue_execution(self) -> None:
|
|
438
|
+
def _continue_execution(self, modified_input: Optional[dict] = None) -> None:
|
|
429
439
|
"""
|
|
430
|
-
Send continue action to Claude.
|
|
440
|
+
Send continue action to Claude with optional input modification.
|
|
431
441
|
|
|
432
442
|
WHY: Centralized response ensures consistent format
|
|
433
443
|
and makes it easier to add response modifications.
|
|
444
|
+
|
|
445
|
+
Args:
|
|
446
|
+
modified_input: Modified tool parameters for PreToolUse hooks (v2.0.30+)
|
|
434
447
|
"""
|
|
435
|
-
|
|
448
|
+
if modified_input is not None:
|
|
449
|
+
# Claude Code v2.0.30+ supports modifying PreToolUse tool inputs
|
|
450
|
+
print(json.dumps({"action": "continue", "tool_input": modified_input}))
|
|
451
|
+
else:
|
|
452
|
+
print(json.dumps({"action": "continue"}))
|
|
436
453
|
|
|
437
454
|
# Delegation methods for compatibility with event_handlers
|
|
438
455
|
def _track_delegation(self, session_id: str, agent_type: str, request_data=None):
|
|
@@ -192,6 +192,8 @@ main "$@"
|
|
|
192
192
|
|
|
193
193
|
# Minimum Claude Code version required for hook monitoring
|
|
194
194
|
MIN_CLAUDE_VERSION = "1.0.92"
|
|
195
|
+
# Minimum version for PreToolUse input modification support
|
|
196
|
+
MIN_PRETOOL_MODIFY_VERSION = "2.0.30"
|
|
195
197
|
|
|
196
198
|
def __init__(self):
|
|
197
199
|
"""Initialize the hook installer."""
|
|
@@ -292,6 +294,42 @@ main "$@"
|
|
|
292
294
|
|
|
293
295
|
return (True, f"Claude Code {version} is compatible with hook monitoring.")
|
|
294
296
|
|
|
297
|
+
def supports_pretool_modify(self) -> bool:
|
|
298
|
+
"""
|
|
299
|
+
Check if the installed Claude Code version supports PreToolUse input modification.
|
|
300
|
+
|
|
301
|
+
PreToolUse input modification was added in Claude Code v2.0.30.
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
True if version supports input modification, False otherwise
|
|
305
|
+
"""
|
|
306
|
+
version = self.get_claude_version()
|
|
307
|
+
|
|
308
|
+
if version is None:
|
|
309
|
+
return False
|
|
310
|
+
|
|
311
|
+
def parse_version(v: str) -> List[int]:
|
|
312
|
+
"""Parse semantic version string to list of integers."""
|
|
313
|
+
try:
|
|
314
|
+
return [int(x) for x in v.split(".")]
|
|
315
|
+
except (ValueError, AttributeError):
|
|
316
|
+
return [0]
|
|
317
|
+
|
|
318
|
+
current = parse_version(version)
|
|
319
|
+
required = parse_version(self.MIN_PRETOOL_MODIFY_VERSION)
|
|
320
|
+
|
|
321
|
+
# Compare versions
|
|
322
|
+
for i in range(max(len(current), len(required))):
|
|
323
|
+
curr_part = current[i] if i < len(current) else 0
|
|
324
|
+
req_part = required[i] if i < len(required) else 0
|
|
325
|
+
|
|
326
|
+
if curr_part < req_part:
|
|
327
|
+
return False
|
|
328
|
+
if curr_part > req_part:
|
|
329
|
+
return True
|
|
330
|
+
|
|
331
|
+
return True
|
|
332
|
+
|
|
295
333
|
def get_hook_script_path(self) -> Path:
|
|
296
334
|
"""Get the path to the hook handler script based on installation method.
|
|
297
335
|
|
|
@@ -677,6 +715,7 @@ main "$@"
|
|
|
677
715
|
# Check version compatibility
|
|
678
716
|
claude_version = self.get_claude_version()
|
|
679
717
|
is_compatible, version_message = self.is_version_compatible()
|
|
718
|
+
pretool_modify_supported = self.supports_pretool_modify()
|
|
680
719
|
|
|
681
720
|
is_valid, issues = self.verify_hooks()
|
|
682
721
|
|
|
@@ -701,6 +740,12 @@ main "$@"
|
|
|
701
740
|
"version_compatible": is_compatible,
|
|
702
741
|
"version_message": version_message,
|
|
703
742
|
"deployment_type": "deployment-root", # New field to indicate new architecture
|
|
743
|
+
"pretool_modify_supported": pretool_modify_supported, # v2.0.30+ feature
|
|
744
|
+
"pretool_modify_message": (
|
|
745
|
+
f"PreToolUse input modification supported (v{claude_version})"
|
|
746
|
+
if pretool_modify_supported
|
|
747
|
+
else f"PreToolUse input modification requires Claude Code {self.MIN_PRETOOL_MODIFY_VERSION}+ (current: {claude_version or 'unknown'})"
|
|
748
|
+
),
|
|
704
749
|
}
|
|
705
750
|
|
|
706
751
|
# Check Claude settings for hook configuration
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Claude MPM Hook Templates
|
|
2
|
+
|
|
3
|
+
This directory contains ready-to-use hook templates for extending Claude Code functionality.
|
|
4
|
+
|
|
5
|
+
## Available Templates
|
|
6
|
+
|
|
7
|
+
### PreToolUse Hooks (Claude Code v2.0.30+)
|
|
8
|
+
|
|
9
|
+
#### `pre_tool_use_template.py`
|
|
10
|
+
|
|
11
|
+
Comprehensive template with multiple example implementations:
|
|
12
|
+
|
|
13
|
+
- **ContextInjectionHook**: Auto-inject project context into file operations
|
|
14
|
+
- **SecurityGuardHook**: Block operations on sensitive files
|
|
15
|
+
- **LoggingHook**: Log all tool invocations for debugging
|
|
16
|
+
- **ParameterEnhancementHook**: Add default parameters to tool calls
|
|
17
|
+
|
|
18
|
+
**Usage:**
|
|
19
|
+
```bash
|
|
20
|
+
# Copy and customize
|
|
21
|
+
cp pre_tool_use_template.py ~/.claude-mpm/hooks/my_hook.py
|
|
22
|
+
chmod +x ~/.claude-mpm/hooks/my_hook.py
|
|
23
|
+
|
|
24
|
+
# Edit to uncomment the implementation you want
|
|
25
|
+
nano ~/.claude-mpm/hooks/my_hook.py
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
#### `pre_tool_use_simple.py`
|
|
29
|
+
|
|
30
|
+
Minimal example for quick customization:
|
|
31
|
+
|
|
32
|
+
- Shows basic hook structure
|
|
33
|
+
- Includes simple parameter enhancement example
|
|
34
|
+
- Includes security guard example
|
|
35
|
+
- Easy to understand and modify
|
|
36
|
+
|
|
37
|
+
**Usage:**
|
|
38
|
+
```bash
|
|
39
|
+
# Copy for quick start
|
|
40
|
+
cp pre_tool_use_simple.py ~/.claude-mpm/hooks/my_hook.py
|
|
41
|
+
chmod +x ~/.claude-mpm/hooks/my_hook.py
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Configuration
|
|
45
|
+
|
|
46
|
+
Add hooks to `~/.claude/settings.json`:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"hooks": {
|
|
51
|
+
"PreToolUse": [
|
|
52
|
+
{
|
|
53
|
+
"matcher": "*",
|
|
54
|
+
"hooks": [
|
|
55
|
+
{
|
|
56
|
+
"type": "command",
|
|
57
|
+
"command": "/Users/YOUR_USERNAME/.claude-mpm/hooks/my_hook.py",
|
|
58
|
+
"modifyInput": true
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Requirements
|
|
68
|
+
|
|
69
|
+
- Claude Code v2.0.30+ for PreToolUse input modification
|
|
70
|
+
- Python 3.7+
|
|
71
|
+
- claude-mpm installed and configured
|
|
72
|
+
|
|
73
|
+
## Version Check
|
|
74
|
+
|
|
75
|
+
Check if your Claude Code version supports input modification:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
claude --version
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Or programmatically:
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
from claude_mpm.hooks.claude_hooks.installer import HookInstaller
|
|
85
|
+
|
|
86
|
+
installer = HookInstaller()
|
|
87
|
+
if installer.supports_pretool_modify():
|
|
88
|
+
print("✓ PreToolUse input modification supported")
|
|
89
|
+
else:
|
|
90
|
+
print(f"✗ Requires Claude Code 2.0.30+ (current: {installer.get_claude_version()})")
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Documentation
|
|
94
|
+
|
|
95
|
+
See [PreToolUse Hook Documentation](../../../docs/developer/pretool-use-hooks.md) for:
|
|
96
|
+
- Detailed usage guide
|
|
97
|
+
- Best practices
|
|
98
|
+
- Testing strategies
|
|
99
|
+
- Troubleshooting
|
|
100
|
+
- Advanced examples
|
|
101
|
+
|
|
102
|
+
## Quick Examples
|
|
103
|
+
|
|
104
|
+
### Add Line Numbers to Grep
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
#!/usr/bin/env python3
|
|
108
|
+
import json
|
|
109
|
+
import sys
|
|
110
|
+
|
|
111
|
+
event = json.loads(sys.stdin.read())
|
|
112
|
+
if event.get("tool_name") == "Grep":
|
|
113
|
+
modified = event["tool_input"].copy()
|
|
114
|
+
modified["-n"] = True
|
|
115
|
+
print(json.dumps({"action": "continue", "tool_input": modified}))
|
|
116
|
+
else:
|
|
117
|
+
print(json.dumps({"action": "continue"}))
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Block Sensitive Files
|
|
121
|
+
|
|
122
|
+
```python
|
|
123
|
+
#!/usr/bin/env python3
|
|
124
|
+
import json
|
|
125
|
+
import sys
|
|
126
|
+
|
|
127
|
+
event = json.loads(sys.stdin.read())
|
|
128
|
+
tool_name = event.get("tool_name", "")
|
|
129
|
+
if tool_name in ["Write", "Edit", "Read"]:
|
|
130
|
+
file_path = event["tool_input"].get("file_path", "")
|
|
131
|
+
if ".env" in file_path:
|
|
132
|
+
print(json.dumps({"action": "block", "message": "Access to .env blocked"}))
|
|
133
|
+
sys.exit(0)
|
|
134
|
+
|
|
135
|
+
print(json.dumps({"action": "continue"}))
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Add Default Timeout to Bash
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
#!/usr/bin/env python3
|
|
142
|
+
import json
|
|
143
|
+
import sys
|
|
144
|
+
|
|
145
|
+
event = json.loads(sys.stdin.read())
|
|
146
|
+
if event.get("tool_name") == "Bash":
|
|
147
|
+
modified = event["tool_input"].copy()
|
|
148
|
+
if "timeout" not in modified:
|
|
149
|
+
modified["timeout"] = 30000 # 30 seconds
|
|
150
|
+
print(json.dumps({"action": "continue", "tool_input": modified}))
|
|
151
|
+
sys.exit(0)
|
|
152
|
+
|
|
153
|
+
print(json.dumps({"action": "continue"}))
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Testing Your Hook
|
|
157
|
+
|
|
158
|
+
Test manually with sample input:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
echo '{
|
|
162
|
+
"hook_event_name": "PreToolUse",
|
|
163
|
+
"tool_name": "Grep",
|
|
164
|
+
"tool_input": {"pattern": "test"},
|
|
165
|
+
"session_id": "test123",
|
|
166
|
+
"cwd": "/tmp"
|
|
167
|
+
}' | python3 your_hook.py
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Enable debug mode:
|
|
171
|
+
```bash
|
|
172
|
+
export CLAUDE_MPM_HOOK_DEBUG=true
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Support
|
|
176
|
+
|
|
177
|
+
For issues or questions:
|
|
178
|
+
- See [Documentation](../../../docs/developer/pretool-use-hooks.md)
|
|
179
|
+
- Check [GitHub Issues](https://github.com/yourusername/claude-mpm/issues)
|
|
180
|
+
- Review [Examples](./pre_tool_use_template.py)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Simple PreToolUse Hook Example for Claude Code v2.0.30+
|
|
4
|
+
|
|
5
|
+
This is a minimal example showing the basic structure of a PreToolUse hook
|
|
6
|
+
that can modify tool inputs.
|
|
7
|
+
|
|
8
|
+
To use this hook:
|
|
9
|
+
1. Copy this file to ~/.claude-mpm/hooks/
|
|
10
|
+
2. Make it executable: chmod +x ~/.claude-mpm/hooks/pre_tool_use_simple.py
|
|
11
|
+
3. Add to ~/.claude/settings.json:
|
|
12
|
+
|
|
13
|
+
{
|
|
14
|
+
"hooks": {
|
|
15
|
+
"PreToolUse": [
|
|
16
|
+
{
|
|
17
|
+
"matcher": "*",
|
|
18
|
+
"hooks": [
|
|
19
|
+
{
|
|
20
|
+
"type": "command",
|
|
21
|
+
"command": "/Users/YOUR_USERNAME/.claude-mpm/hooks/pre_tool_use_simple.py",
|
|
22
|
+
"modifyInput": true
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
import json
|
|
32
|
+
import sys
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def main():
|
|
36
|
+
"""Process PreToolUse event and optionally modify input."""
|
|
37
|
+
try:
|
|
38
|
+
# Read event from stdin
|
|
39
|
+
event_data = sys.stdin.read()
|
|
40
|
+
if not event_data.strip():
|
|
41
|
+
print(json.dumps({"action": "continue"}))
|
|
42
|
+
return
|
|
43
|
+
|
|
44
|
+
event = json.loads(event_data)
|
|
45
|
+
tool_name = event.get("tool_name", "")
|
|
46
|
+
tool_input = event.get("tool_input", {})
|
|
47
|
+
|
|
48
|
+
# Example: Add line numbers to all Grep operations
|
|
49
|
+
if tool_name == "Grep" and "-n" not in tool_input:
|
|
50
|
+
modified_input = tool_input.copy()
|
|
51
|
+
modified_input["-n"] = True
|
|
52
|
+
print(json.dumps({"action": "continue", "tool_input": modified_input}))
|
|
53
|
+
return
|
|
54
|
+
|
|
55
|
+
# Example: Block operations on .env files
|
|
56
|
+
if tool_name in ["Write", "Edit", "Read"]:
|
|
57
|
+
file_path = tool_input.get("file_path", "")
|
|
58
|
+
if ".env" in file_path:
|
|
59
|
+
print(
|
|
60
|
+
json.dumps(
|
|
61
|
+
{
|
|
62
|
+
"action": "block",
|
|
63
|
+
"message": "Access to .env file blocked for security",
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
return
|
|
68
|
+
|
|
69
|
+
# Default: continue without modification
|
|
70
|
+
print(json.dumps({"action": "continue"}))
|
|
71
|
+
|
|
72
|
+
except Exception:
|
|
73
|
+
# Always continue on error to avoid blocking Claude
|
|
74
|
+
print(json.dumps({"action": "continue"}))
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
if __name__ == "__main__":
|
|
78
|
+
main()
|