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,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()
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
PreToolUse Hook Template for Claude Code v2.0.30+
|
|
4
|
+
|
|
5
|
+
This template demonstrates how to create PreToolUse hooks that can modify
|
|
6
|
+
tool inputs before execution. Use cases include:
|
|
7
|
+
|
|
8
|
+
1. Context Injection: Add project context to Read/Edit operations
|
|
9
|
+
2. Security Guards: Validate file paths before operations
|
|
10
|
+
3. Logging: Log tool invocations before execution
|
|
11
|
+
4. Parameter Enhancement: Add default parameters to tool calls
|
|
12
|
+
|
|
13
|
+
Requirements:
|
|
14
|
+
- Claude Code v2.0.30 or higher
|
|
15
|
+
- Hook must be configured with "modifyInput": true in settings.json
|
|
16
|
+
|
|
17
|
+
Input Format (stdin):
|
|
18
|
+
{
|
|
19
|
+
"hook_event_name": "PreToolUse",
|
|
20
|
+
"tool_name": "Edit",
|
|
21
|
+
"tool_input": {
|
|
22
|
+
"file_path": "/path/to/file.py",
|
|
23
|
+
"old_string": "foo",
|
|
24
|
+
"new_string": "bar"
|
|
25
|
+
},
|
|
26
|
+
"session_id": "abc123...",
|
|
27
|
+
"cwd": "/working/directory"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
Output Format (stdout):
|
|
31
|
+
{
|
|
32
|
+
"action": "continue",
|
|
33
|
+
"tool_input": {
|
|
34
|
+
"file_path": "/path/to/file.py",
|
|
35
|
+
"old_string": "foo",
|
|
36
|
+
"new_string": "bar_modified"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
Or to block execution:
|
|
41
|
+
{
|
|
42
|
+
"action": "block",
|
|
43
|
+
"message": "Reason for blocking"
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
Or to continue without modification:
|
|
47
|
+
{
|
|
48
|
+
"action": "continue"
|
|
49
|
+
}
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
import json
|
|
53
|
+
import os
|
|
54
|
+
import sys
|
|
55
|
+
from pathlib import Path
|
|
56
|
+
from typing import Any, Dict, Optional
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class PreToolUseHook:
|
|
60
|
+
"""Base class for PreToolUse hooks with input modification support."""
|
|
61
|
+
|
|
62
|
+
def __init__(self):
|
|
63
|
+
"""Initialize the hook."""
|
|
64
|
+
self.debug = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "false").lower() == "true"
|
|
65
|
+
|
|
66
|
+
def log_debug(self, message: str) -> None:
|
|
67
|
+
"""Log debug message to stderr."""
|
|
68
|
+
if self.debug:
|
|
69
|
+
print(f"[PreToolUse Hook] {message}", file=sys.stderr)
|
|
70
|
+
|
|
71
|
+
def read_event(self) -> Optional[Dict[str, Any]]:
|
|
72
|
+
"""Read and parse the hook event from stdin."""
|
|
73
|
+
try:
|
|
74
|
+
event_data = sys.stdin.read()
|
|
75
|
+
if not event_data.strip():
|
|
76
|
+
return None
|
|
77
|
+
return json.loads(event_data)
|
|
78
|
+
except json.JSONDecodeError as e:
|
|
79
|
+
self.log_debug(f"Failed to parse event: {e}")
|
|
80
|
+
return None
|
|
81
|
+
except Exception as e:
|
|
82
|
+
self.log_debug(f"Error reading event: {e}")
|
|
83
|
+
return None
|
|
84
|
+
|
|
85
|
+
def continue_execution(
|
|
86
|
+
self, modified_input: Optional[Dict[str, Any]] = None
|
|
87
|
+
) -> None:
|
|
88
|
+
"""Continue execution with optional modified input."""
|
|
89
|
+
response = {"action": "continue"}
|
|
90
|
+
if modified_input is not None:
|
|
91
|
+
response["tool_input"] = modified_input
|
|
92
|
+
print(json.dumps(response))
|
|
93
|
+
|
|
94
|
+
def block_execution(self, message: str) -> None:
|
|
95
|
+
"""Block execution with a message."""
|
|
96
|
+
response = {"action": "block", "message": message}
|
|
97
|
+
print(json.dumps(response))
|
|
98
|
+
|
|
99
|
+
def modify_input(
|
|
100
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
101
|
+
) -> Optional[Dict[str, Any]]:
|
|
102
|
+
"""
|
|
103
|
+
Modify tool input before execution.
|
|
104
|
+
|
|
105
|
+
Override this method in subclasses to implement custom logic.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
tool_name: Name of the tool being invoked
|
|
109
|
+
tool_input: Original tool input parameters
|
|
110
|
+
event: Full event data including session_id, cwd, etc.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
Modified tool input dict, or None to continue without modification
|
|
114
|
+
"""
|
|
115
|
+
# Default: no modification
|
|
116
|
+
return None
|
|
117
|
+
|
|
118
|
+
def should_block(
|
|
119
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
120
|
+
) -> tuple[bool, str]:
|
|
121
|
+
"""
|
|
122
|
+
Check if execution should be blocked.
|
|
123
|
+
|
|
124
|
+
Override this method in subclasses to implement validation logic.
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
tool_name: Name of the tool being invoked
|
|
128
|
+
tool_input: Original tool input parameters
|
|
129
|
+
event: Full event data including session_id, cwd, etc.
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
Tuple of (should_block, reason)
|
|
133
|
+
"""
|
|
134
|
+
# Default: don't block
|
|
135
|
+
return False, ""
|
|
136
|
+
|
|
137
|
+
def run(self) -> None:
|
|
138
|
+
"""Main entry point for the hook."""
|
|
139
|
+
try:
|
|
140
|
+
# Read event from stdin
|
|
141
|
+
event = self.read_event()
|
|
142
|
+
if not event:
|
|
143
|
+
self.continue_execution()
|
|
144
|
+
return
|
|
145
|
+
|
|
146
|
+
tool_name = event.get("tool_name", "")
|
|
147
|
+
tool_input = event.get("tool_input", {})
|
|
148
|
+
|
|
149
|
+
self.log_debug(
|
|
150
|
+
f"Processing {tool_name} with input: {list(tool_input.keys())}"
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
# Check if execution should be blocked
|
|
154
|
+
should_block, reason = self.should_block(tool_name, tool_input, event)
|
|
155
|
+
if should_block:
|
|
156
|
+
self.log_debug(f"Blocking {tool_name}: {reason}")
|
|
157
|
+
self.block_execution(reason)
|
|
158
|
+
return
|
|
159
|
+
|
|
160
|
+
# Try to modify input
|
|
161
|
+
modified_input = self.modify_input(tool_name, tool_input, event)
|
|
162
|
+
if modified_input is not None:
|
|
163
|
+
self.log_debug(f"Modified {tool_name} input")
|
|
164
|
+
self.continue_execution(modified_input)
|
|
165
|
+
else:
|
|
166
|
+
self.log_debug(f"No modification for {tool_name}")
|
|
167
|
+
self.continue_execution()
|
|
168
|
+
|
|
169
|
+
except Exception as e:
|
|
170
|
+
self.log_debug(f"Hook error: {e}")
|
|
171
|
+
# Always continue on error to avoid blocking Claude
|
|
172
|
+
self.continue_execution()
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
# ============================================================================
|
|
176
|
+
# Example Implementations
|
|
177
|
+
# ============================================================================
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class ContextInjectionHook(PreToolUseHook):
|
|
181
|
+
"""
|
|
182
|
+
Example: Auto-inject project context into Read/Edit tool calls.
|
|
183
|
+
|
|
184
|
+
This hook adds project-specific context as comments to file operations.
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
def __init__(self):
|
|
188
|
+
super().__init__()
|
|
189
|
+
self.project_context = self._load_project_context()
|
|
190
|
+
|
|
191
|
+
def _load_project_context(self) -> str:
|
|
192
|
+
"""Load project context from a file or environment."""
|
|
193
|
+
# Example: Load from .claude-context file
|
|
194
|
+
context_file = Path.cwd() / ".claude-context"
|
|
195
|
+
if context_file.exists():
|
|
196
|
+
return context_file.read_text()
|
|
197
|
+
return ""
|
|
198
|
+
|
|
199
|
+
def modify_input(
|
|
200
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
201
|
+
) -> Optional[Dict[str, Any]]:
|
|
202
|
+
"""Inject context into Read operations."""
|
|
203
|
+
if tool_name == "Read" and self.project_context:
|
|
204
|
+
# Add context as a note (this is conceptual - actual implementation depends on use case)
|
|
205
|
+
modified = tool_input.copy()
|
|
206
|
+
# You could add context to a metadata field if the tool supports it
|
|
207
|
+
modified["_context"] = self.project_context[:200]
|
|
208
|
+
return modified
|
|
209
|
+
return None
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
class SecurityGuardHook(PreToolUseHook):
|
|
213
|
+
"""
|
|
214
|
+
Example: Validate file paths before file operations.
|
|
215
|
+
|
|
216
|
+
This hook blocks operations on sensitive files or directories.
|
|
217
|
+
"""
|
|
218
|
+
|
|
219
|
+
BLOCKED_PATHS = [
|
|
220
|
+
".env",
|
|
221
|
+
"credentials.json",
|
|
222
|
+
"secrets/",
|
|
223
|
+
".ssh/",
|
|
224
|
+
"id_rsa",
|
|
225
|
+
]
|
|
226
|
+
|
|
227
|
+
def should_block(
|
|
228
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
229
|
+
) -> tuple[bool, str]:
|
|
230
|
+
"""Block operations on sensitive files."""
|
|
231
|
+
if tool_name in ["Write", "Edit", "Read"]:
|
|
232
|
+
file_path = tool_input.get("file_path", "")
|
|
233
|
+
if any(blocked in file_path for blocked in self.BLOCKED_PATHS):
|
|
234
|
+
return True, f"Access to sensitive file blocked: {file_path}"
|
|
235
|
+
return False, ""
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
class LoggingHook(PreToolUseHook):
|
|
239
|
+
"""
|
|
240
|
+
Example: Log all tool invocations before execution.
|
|
241
|
+
|
|
242
|
+
This hook logs tool calls to a file for debugging and audit purposes.
|
|
243
|
+
"""
|
|
244
|
+
|
|
245
|
+
def __init__(self):
|
|
246
|
+
super().__init__()
|
|
247
|
+
self.log_file = Path.home() / ".claude-mpm" / "tool-calls.log"
|
|
248
|
+
self.log_file.parent.mkdir(exist_ok=True)
|
|
249
|
+
|
|
250
|
+
def modify_input(
|
|
251
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
252
|
+
) -> Optional[Dict[str, Any]]:
|
|
253
|
+
"""Log the tool call."""
|
|
254
|
+
try:
|
|
255
|
+
from datetime import datetime, timezone
|
|
256
|
+
|
|
257
|
+
log_entry = {
|
|
258
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
259
|
+
"tool_name": tool_name,
|
|
260
|
+
"session_id": event.get("session_id", ""),
|
|
261
|
+
"cwd": event.get("cwd", ""),
|
|
262
|
+
"parameters": list(tool_input.keys()),
|
|
263
|
+
}
|
|
264
|
+
with self.log_file.open("a") as f:
|
|
265
|
+
f.write(json.dumps(log_entry) + "\n")
|
|
266
|
+
except Exception as e:
|
|
267
|
+
self.log_debug(f"Failed to log tool call: {e}")
|
|
268
|
+
|
|
269
|
+
# Don't modify input, just log
|
|
270
|
+
return None
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
class ParameterEnhancementHook(PreToolUseHook):
|
|
274
|
+
"""
|
|
275
|
+
Example: Add default parameters to tool calls.
|
|
276
|
+
|
|
277
|
+
This hook adds default values to tool parameters if not provided.
|
|
278
|
+
"""
|
|
279
|
+
|
|
280
|
+
def modify_input(
|
|
281
|
+
self, tool_name: str, tool_input: Dict[str, Any], event: Dict[str, Any]
|
|
282
|
+
) -> Optional[Dict[str, Any]]:
|
|
283
|
+
"""Add default parameters."""
|
|
284
|
+
modified = tool_input.copy()
|
|
285
|
+
|
|
286
|
+
if tool_name == "Bash":
|
|
287
|
+
# Add default timeout if not specified
|
|
288
|
+
if "timeout" not in modified:
|
|
289
|
+
modified["timeout"] = 30000 # 30 seconds
|
|
290
|
+
return modified
|
|
291
|
+
|
|
292
|
+
elif tool_name == "Grep":
|
|
293
|
+
# Add line numbers by default
|
|
294
|
+
if "-n" not in modified:
|
|
295
|
+
modified["-n"] = True
|
|
296
|
+
return modified
|
|
297
|
+
|
|
298
|
+
return None
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
# ============================================================================
|
|
302
|
+
# Main Entry Point
|
|
303
|
+
# ============================================================================
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
def main():
|
|
307
|
+
"""Main entry point - choose which hook implementation to use."""
|
|
308
|
+
# Select which hook implementation to use
|
|
309
|
+
# Uncomment the one you want to use:
|
|
310
|
+
|
|
311
|
+
# hook = ContextInjectionHook()
|
|
312
|
+
# hook = SecurityGuardHook()
|
|
313
|
+
# hook = LoggingHook()
|
|
314
|
+
# hook = ParameterEnhancementHook()
|
|
315
|
+
|
|
316
|
+
# Default: use base hook (no modification)
|
|
317
|
+
hook = PreToolUseHook()
|
|
318
|
+
|
|
319
|
+
hook.run()
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
if __name__ == "__main__":
|
|
323
|
+
main()
|