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
|
@@ -539,7 +539,7 @@ class ConnectionEventHandler(BaseEventHandler):
|
|
|
539
539
|
if data and "timestamp" in data:
|
|
540
540
|
rtt = current_time - data["timestamp"]
|
|
541
541
|
if rtt < 10: # Reasonable RTT
|
|
542
|
-
self.logger.debug(f"🏓 Pong from {sid}, RTT: {rtt*1000:.1f}ms")
|
|
542
|
+
self.logger.debug(f"🏓 Pong from {sid}, RTT: {rtt * 1000:.1f}ms")
|
|
543
543
|
|
|
544
544
|
def _normalize_event(self, event_data: Dict[str, Any]) -> Dict[str, Any]:
|
|
545
545
|
"""Normalize event format to ensure consistency.
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"""Connection event handlers for Socket.IO.
|
|
2
|
+
|
|
3
|
+
WHY: This module handles all connection-related events including connect,
|
|
4
|
+
disconnect, status requests, and history management. Separating these
|
|
5
|
+
from other handlers makes connection management more maintainable.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from datetime import datetime
|
|
9
|
+
from typing import Any, Dict, List, Optional, Set
|
|
10
|
+
|
|
11
|
+
from ....core.typing_utils import ClaudeStatus, EventData, SocketId
|
|
12
|
+
from .base import BaseEventHandler
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ConnectionEventHandler(BaseEventHandler):
|
|
16
|
+
"""Handles Socket.IO connection lifecycle events.
|
|
17
|
+
|
|
18
|
+
WHY: Connection management is a critical aspect of the Socket.IO server
|
|
19
|
+
that deserves its own focused handler. This includes client connections,
|
|
20
|
+
disconnections, status updates, and event history management.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def register_events(self) -> None:
|
|
24
|
+
"""Register connection-related event handlers."""
|
|
25
|
+
|
|
26
|
+
@self.sio.event
|
|
27
|
+
async def connect(sid, environ, *args):
|
|
28
|
+
"""Handle client connection.
|
|
29
|
+
|
|
30
|
+
WHY: When a client connects, we need to track them, send initial
|
|
31
|
+
status information, and provide recent event history so they have
|
|
32
|
+
context for what's happening in the session.
|
|
33
|
+
"""
|
|
34
|
+
self.clients.add(sid)
|
|
35
|
+
client_addr = environ.get("REMOTE_ADDR", "unknown")
|
|
36
|
+
user_agent = environ.get("HTTP_USER_AGENT", "unknown")
|
|
37
|
+
self.logger.info(f"🔗 NEW CLIENT CONNECTED: {sid} from {client_addr}")
|
|
38
|
+
self.logger.info(f"📱 User Agent: {user_agent[:100]}...")
|
|
39
|
+
self.logger.info(f"📈 Total clients now: {len(self.clients)}")
|
|
40
|
+
|
|
41
|
+
# Send initial status immediately with enhanced data
|
|
42
|
+
status_data = {
|
|
43
|
+
"server": "claude-mpm-python-socketio",
|
|
44
|
+
"timestamp": datetime.utcnow().isoformat() + "Z",
|
|
45
|
+
"clients_connected": len(self.clients),
|
|
46
|
+
"session_id": self.server.session_id,
|
|
47
|
+
"claude_status": self.server.claude_status,
|
|
48
|
+
"claude_pid": self.server.claude_pid,
|
|
49
|
+
"server_version": "2.0.0",
|
|
50
|
+
"client_id": sid,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
await self.emit_to_client(sid, "status", status_data)
|
|
55
|
+
await self.emit_to_client(
|
|
56
|
+
sid,
|
|
57
|
+
"welcome",
|
|
58
|
+
{
|
|
59
|
+
"message": "Connected to Claude MPM Socket.IO server",
|
|
60
|
+
"client_id": sid,
|
|
61
|
+
"server_time": datetime.utcnow().isoformat() + "Z",
|
|
62
|
+
},
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Automatically send the last 50 events to new clients
|
|
66
|
+
await self._send_event_history(sid, limit=50)
|
|
67
|
+
|
|
68
|
+
self.logger.debug(
|
|
69
|
+
f"✅ Sent welcome messages and event history to client {sid}"
|
|
70
|
+
)
|
|
71
|
+
except Exception as e:
|
|
72
|
+
self.log_error(f"sending welcome to client {sid}", e)
|
|
73
|
+
|
|
74
|
+
@self.sio.event
|
|
75
|
+
async def disconnect(sid):
|
|
76
|
+
"""Handle client disconnection.
|
|
77
|
+
|
|
78
|
+
WHY: We need to clean up client tracking when they disconnect
|
|
79
|
+
to maintain accurate connection counts and avoid memory leaks.
|
|
80
|
+
"""
|
|
81
|
+
if sid in self.clients:
|
|
82
|
+
self.clients.remove(sid)
|
|
83
|
+
self.logger.info(f"🔌 CLIENT DISCONNECTED: {sid}")
|
|
84
|
+
self.logger.info(f"📉 Total clients now: {len(self.clients)}")
|
|
85
|
+
else:
|
|
86
|
+
self.logger.warning(
|
|
87
|
+
f"⚠️ Attempted to disconnect unknown client: {sid}"
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
@self.sio.event
|
|
91
|
+
async def get_status(sid):
|
|
92
|
+
"""Handle status request.
|
|
93
|
+
|
|
94
|
+
WHY: Clients need to query current server status on demand
|
|
95
|
+
to update their UI or verify connection health.
|
|
96
|
+
"""
|
|
97
|
+
status_data = {
|
|
98
|
+
"server": "claude-mpm-python-socketio",
|
|
99
|
+
"timestamp": datetime.utcnow().isoformat() + "Z",
|
|
100
|
+
"clients_connected": len(self.clients),
|
|
101
|
+
"session_id": self.server.session_id,
|
|
102
|
+
"claude_status": self.server.claude_status,
|
|
103
|
+
"claude_pid": self.server.claude_pid,
|
|
104
|
+
}
|
|
105
|
+
await self.emit_to_client(sid, "status", status_data)
|
|
106
|
+
|
|
107
|
+
@self.sio.event
|
|
108
|
+
async def get_history(sid, data=None):
|
|
109
|
+
"""Handle history request.
|
|
110
|
+
|
|
111
|
+
WHY: Clients may need to request specific event history
|
|
112
|
+
to reconstruct state or filter by event types.
|
|
113
|
+
"""
|
|
114
|
+
params = data or {}
|
|
115
|
+
event_types = params.get("event_types", [])
|
|
116
|
+
limit = min(params.get("limit", 100), len(self.event_history))
|
|
117
|
+
|
|
118
|
+
await self._send_event_history(sid, event_types=event_types, limit=limit)
|
|
119
|
+
|
|
120
|
+
@self.sio.event
|
|
121
|
+
async def request_history(sid, data=None):
|
|
122
|
+
"""Handle legacy history request (for client compatibility).
|
|
123
|
+
|
|
124
|
+
WHY: Maintains backward compatibility with clients using
|
|
125
|
+
the older 'request.history' event name.
|
|
126
|
+
"""
|
|
127
|
+
params = data or {}
|
|
128
|
+
event_types = params.get("event_types", [])
|
|
129
|
+
limit = min(params.get("limit", 50), len(self.event_history))
|
|
130
|
+
|
|
131
|
+
await self._send_event_history(sid, event_types=event_types, limit=limit)
|
|
132
|
+
|
|
133
|
+
@self.sio.event
|
|
134
|
+
async def subscribe(sid, data=None):
|
|
135
|
+
"""Handle subscription request.
|
|
136
|
+
|
|
137
|
+
WHY: Allows clients to subscribe to specific event channels
|
|
138
|
+
for filtered event streaming.
|
|
139
|
+
"""
|
|
140
|
+
channels = data.get("channels", ["*"]) if data else ["*"]
|
|
141
|
+
await self.emit_to_client(sid, "subscribed", {"channels": channels})
|
|
142
|
+
|
|
143
|
+
@self.sio.event
|
|
144
|
+
async def claude_event(sid, data):
|
|
145
|
+
"""Handle events from client proxies.
|
|
146
|
+
|
|
147
|
+
WHY: Client proxies send events that need to be stored
|
|
148
|
+
in history and re-broadcast to other clients.
|
|
149
|
+
"""
|
|
150
|
+
# Store in history
|
|
151
|
+
self.event_history.append(data)
|
|
152
|
+
self.logger.debug(
|
|
153
|
+
f"📚 Event from client stored in history (total: {len(self.event_history)})"
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# Re-broadcast to all other clients
|
|
157
|
+
await self.broadcast_event("claude_event", data, skip_sid=sid)
|
|
158
|
+
|
|
159
|
+
async def _send_event_history(
|
|
160
|
+
self, sid: str, event_types: Optional[List[str]] = None, limit: int = 50
|
|
161
|
+
):
|
|
162
|
+
"""Send event history to a specific client.
|
|
163
|
+
|
|
164
|
+
WHY: When clients connect to the dashboard, they need context from recent events
|
|
165
|
+
to understand what's been happening. This sends the most recent events in
|
|
166
|
+
chronological order (oldest first) so the dashboard displays them properly.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
sid: Socket.IO session ID of the client
|
|
170
|
+
event_types: Optional list of event types to filter by
|
|
171
|
+
limit: Maximum number of events to send (default: 50)
|
|
172
|
+
"""
|
|
173
|
+
try:
|
|
174
|
+
if not self.event_history:
|
|
175
|
+
self.logger.debug(f"No event history to send to client {sid}")
|
|
176
|
+
return
|
|
177
|
+
|
|
178
|
+
# Limit to reasonable number to avoid overwhelming client
|
|
179
|
+
limit = min(limit, 100)
|
|
180
|
+
|
|
181
|
+
# Get the most recent events, filtered by type if specified
|
|
182
|
+
history = []
|
|
183
|
+
for event in reversed(self.event_history):
|
|
184
|
+
if not event_types or event.get("type") in event_types:
|
|
185
|
+
history.append(event)
|
|
186
|
+
if len(history) >= limit:
|
|
187
|
+
break
|
|
188
|
+
|
|
189
|
+
# Reverse to get chronological order (oldest first)
|
|
190
|
+
history = list(reversed(history))
|
|
191
|
+
|
|
192
|
+
if history:
|
|
193
|
+
# Send as 'history' event that the client expects
|
|
194
|
+
await self.emit_to_client(
|
|
195
|
+
sid,
|
|
196
|
+
"history",
|
|
197
|
+
{
|
|
198
|
+
"events": history,
|
|
199
|
+
"count": len(history),
|
|
200
|
+
"total_available": len(self.event_history),
|
|
201
|
+
},
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
self.logger.info(
|
|
205
|
+
f"📚 Sent {len(history)} historical events to client {sid}"
|
|
206
|
+
)
|
|
207
|
+
else:
|
|
208
|
+
self.logger.debug(
|
|
209
|
+
f"No matching events found for client {sid} with filters: {event_types}"
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
except Exception as e:
|
|
213
|
+
self.log_error(
|
|
214
|
+
f"sending event history to client {sid}",
|
|
215
|
+
e,
|
|
216
|
+
{"event_types": event_types, "limit": limit},
|
|
217
|
+
)
|
|
@@ -745,7 +745,7 @@ class GitEventHandler(BaseEventHandler):
|
|
|
745
745
|
stdout=asyncio.subprocess.PIPE,
|
|
746
746
|
stderr=asyncio.subprocess.PIPE,
|
|
747
747
|
)
|
|
748
|
-
diff_output,
|
|
748
|
+
diff_output, _ = await diff_proc.communicate()
|
|
749
749
|
|
|
750
750
|
if diff_proc.returncode == 0:
|
|
751
751
|
return {
|
|
@@ -792,7 +792,7 @@ class GitEventHandler(BaseEventHandler):
|
|
|
792
792
|
stdout=asyncio.subprocess.PIPE,
|
|
793
793
|
stderr=asyncio.subprocess.PIPE,
|
|
794
794
|
)
|
|
795
|
-
diff_output,
|
|
795
|
+
diff_output, _diff_error = await diff_proc.communicate()
|
|
796
796
|
|
|
797
797
|
if diff_proc.returncode == 0:
|
|
798
798
|
return {
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""Hook event handlers for Socket.IO.
|
|
2
|
+
|
|
3
|
+
WHY: This module handles hook events from Claude to track session information,
|
|
4
|
+
agent delegations, and other hook-based activity for the system heartbeat.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from datetime import datetime
|
|
8
|
+
from typing import Any, Dict, Optional
|
|
9
|
+
|
|
10
|
+
from .base import BaseEventHandler
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class HookEventHandler(BaseEventHandler):
|
|
14
|
+
"""Handles hook events from Claude for session tracking.
|
|
15
|
+
|
|
16
|
+
WHY: Hook events provide rich information about Claude's activity including
|
|
17
|
+
session starts/stops, agent delegations, and tool usage. This handler
|
|
18
|
+
extracts session information to populate the system heartbeat data.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
def register_events(self) -> None:
|
|
22
|
+
"""Register hook event handlers."""
|
|
23
|
+
|
|
24
|
+
@self.sio.event
|
|
25
|
+
async def claude_event(sid, data):
|
|
26
|
+
"""Handle claude_event which includes hook events.
|
|
27
|
+
|
|
28
|
+
WHY: Hook events are sent as claude_event with type 'hook'
|
|
29
|
+
and contain session and agent delegation information.
|
|
30
|
+
"""
|
|
31
|
+
if not isinstance(data, dict):
|
|
32
|
+
return
|
|
33
|
+
|
|
34
|
+
# Check if this is a hook event
|
|
35
|
+
event_type = data.get("type")
|
|
36
|
+
if event_type != "hook":
|
|
37
|
+
return
|
|
38
|
+
|
|
39
|
+
# Extract hook event details
|
|
40
|
+
hook_event = data.get("event")
|
|
41
|
+
hook_data = data.get("data", {})
|
|
42
|
+
|
|
43
|
+
# Track sessions based on hook events
|
|
44
|
+
if hook_event == "subagent_start":
|
|
45
|
+
await self._handle_subagent_start(hook_data)
|
|
46
|
+
elif hook_event == "subagent_stop":
|
|
47
|
+
await self._handle_subagent_stop(hook_data)
|
|
48
|
+
elif hook_event == "user_prompt":
|
|
49
|
+
await self._handle_user_prompt(hook_data)
|
|
50
|
+
elif hook_event == "pre_tool":
|
|
51
|
+
await self._handle_pre_tool(hook_data)
|
|
52
|
+
|
|
53
|
+
async def _handle_subagent_start(self, data: Dict[str, Any]):
|
|
54
|
+
"""Handle subagent start events.
|
|
55
|
+
|
|
56
|
+
WHY: When a subagent starts, we track it as an active session
|
|
57
|
+
with the agent type and start time for the heartbeat.
|
|
58
|
+
"""
|
|
59
|
+
session_id = data.get("session_id")
|
|
60
|
+
agent_type = data.get("agent_type", "unknown")
|
|
61
|
+
|
|
62
|
+
if not session_id:
|
|
63
|
+
return
|
|
64
|
+
|
|
65
|
+
# Update or create session tracking
|
|
66
|
+
if hasattr(self.server, 'active_sessions'):
|
|
67
|
+
self.server.active_sessions[session_id] = {
|
|
68
|
+
"session_id": session_id,
|
|
69
|
+
"start_time": datetime.now().isoformat(),
|
|
70
|
+
"agent": agent_type,
|
|
71
|
+
"status": "active",
|
|
72
|
+
"prompt": data.get("prompt", "")[:100], # First 100 chars
|
|
73
|
+
"last_activity": datetime.now().isoformat(),
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
self.logger.debug(
|
|
77
|
+
f"Tracked subagent start: session={session_id[:8]}..., agent={agent_type}"
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
async def _handle_subagent_stop(self, data: Dict[str, Any]):
|
|
81
|
+
"""Handle subagent stop events.
|
|
82
|
+
|
|
83
|
+
WHY: When a subagent stops, we update its status or remove it
|
|
84
|
+
from active sessions depending on the stop reason.
|
|
85
|
+
"""
|
|
86
|
+
session_id = data.get("session_id")
|
|
87
|
+
|
|
88
|
+
if not session_id:
|
|
89
|
+
return
|
|
90
|
+
|
|
91
|
+
# Update session status
|
|
92
|
+
if hasattr(self.server, 'active_sessions'):
|
|
93
|
+
if session_id in self.server.active_sessions:
|
|
94
|
+
# Mark as completed rather than removing immediately
|
|
95
|
+
self.server.active_sessions[session_id]["status"] = "completed"
|
|
96
|
+
self.server.active_sessions[session_id]["last_activity"] = datetime.now().isoformat()
|
|
97
|
+
|
|
98
|
+
self.logger.debug(
|
|
99
|
+
f"Marked session completed: session={session_id[:8]}..."
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
async def _handle_user_prompt(self, data: Dict[str, Any]):
|
|
103
|
+
"""Handle user prompt events.
|
|
104
|
+
|
|
105
|
+
WHY: User prompts indicate the start of a new interaction,
|
|
106
|
+
which we track as a PM session if no delegation occurs.
|
|
107
|
+
"""
|
|
108
|
+
session_id = data.get("session_id")
|
|
109
|
+
|
|
110
|
+
if not session_id:
|
|
111
|
+
return
|
|
112
|
+
|
|
113
|
+
# Create or update PM session
|
|
114
|
+
if hasattr(self.server, 'active_sessions'):
|
|
115
|
+
if session_id not in self.server.active_sessions:
|
|
116
|
+
self.server.active_sessions[session_id] = {
|
|
117
|
+
"session_id": session_id,
|
|
118
|
+
"start_time": datetime.now().isoformat(),
|
|
119
|
+
"agent": "pm", # Default to PM
|
|
120
|
+
"status": "active",
|
|
121
|
+
"prompt": data.get("prompt_text", "")[:100],
|
|
122
|
+
"working_directory": data.get("working_directory", ""),
|
|
123
|
+
"last_activity": datetime.now().isoformat(),
|
|
124
|
+
}
|
|
125
|
+
else:
|
|
126
|
+
# Update last activity
|
|
127
|
+
self.server.active_sessions[session_id]["last_activity"] = datetime.now().isoformat()
|
|
128
|
+
|
|
129
|
+
async def _handle_pre_tool(self, data: Dict[str, Any]):
|
|
130
|
+
"""Handle pre-tool events.
|
|
131
|
+
|
|
132
|
+
WHY: Pre-tool events with Task delegation indicate agent changes
|
|
133
|
+
that we need to track for accurate session information.
|
|
134
|
+
"""
|
|
135
|
+
if data.get("tool_name") != "Task":
|
|
136
|
+
return
|
|
137
|
+
|
|
138
|
+
session_id = data.get("session_id")
|
|
139
|
+
delegation_details = data.get("delegation_details", {})
|
|
140
|
+
agent_type = delegation_details.get("agent_type", "unknown")
|
|
141
|
+
|
|
142
|
+
if not session_id:
|
|
143
|
+
return
|
|
144
|
+
|
|
145
|
+
# Update session with new agent
|
|
146
|
+
if hasattr(self.server, 'active_sessions'):
|
|
147
|
+
if session_id in self.server.active_sessions:
|
|
148
|
+
self.server.active_sessions[session_id]["agent"] = agent_type
|
|
149
|
+
self.server.active_sessions[session_id]["status"] = "delegated"
|
|
150
|
+
self.server.active_sessions[session_id]["last_activity"] = datetime.now().isoformat()
|
|
151
|
+
|
|
152
|
+
self.logger.debug(
|
|
153
|
+
f"Updated session delegation: session={session_id[:8]}..., agent={agent_type}"
|
|
154
|
+
)
|
|
@@ -112,9 +112,7 @@ class SystemInstructionsService(BaseService, SystemInstructionsInterface):
|
|
|
112
112
|
self.agent_capabilities_service
|
|
113
113
|
and "{{AGENT_CAPABILITIES}}" in base_pm_content
|
|
114
114
|
):
|
|
115
|
-
capabilities = (
|
|
116
|
-
self.agent_capabilities_service.generate_deployed_agent_capabilities()
|
|
117
|
-
)
|
|
115
|
+
capabilities = self.agent_capabilities_service.generate_deployed_agent_capabilities()
|
|
118
116
|
base_pm_content = base_pm_content.replace(
|
|
119
117
|
"{{AGENT_CAPABILITIES}}", capabilities
|
|
120
118
|
)
|
|
@@ -527,13 +527,11 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
|
|
|
527
527
|
and node.iter.func.id == "range"
|
|
528
528
|
and len(node.iter.args) == 1
|
|
529
529
|
):
|
|
530
|
-
|
|
531
530
|
if isinstance(node.iter.args[0], ast.Call):
|
|
532
531
|
if (
|
|
533
532
|
isinstance(node.iter.args[0].func, ast.Name)
|
|
534
533
|
and node.iter.args[0].func.id == "len"
|
|
535
534
|
):
|
|
536
|
-
|
|
537
535
|
results["optimizations"].append(
|
|
538
536
|
{
|
|
539
537
|
"type": "range_len_pattern",
|
|
@@ -562,7 +560,6 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
|
|
|
562
560
|
"min",
|
|
563
561
|
"max",
|
|
564
562
|
]:
|
|
565
|
-
|
|
566
563
|
results["optimizations"].append(
|
|
567
564
|
{
|
|
568
565
|
"type": "generator_opportunity",
|
|
@@ -64,7 +64,7 @@ class RailwayDeploymentStrategy(DeploymentStrategy):
|
|
|
64
64
|
|
|
65
65
|
def prepare(self, context: DeploymentContext) -> List[Path]:
|
|
66
66
|
"""Prepare Railway artifacts."""
|
|
67
|
-
artifact_path,
|
|
67
|
+
artifact_path, _metadata = prepare_deployment_artifact(
|
|
68
68
|
context.source, "directory", context.config
|
|
69
69
|
)
|
|
70
70
|
return [artifact_path]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.9.0
|
|
@@ -458,17 +458,19 @@ class ConflictResolutionManager:
|
|
|
458
458
|
|
|
459
459
|
for i, marker in enumerate(markers):
|
|
460
460
|
if not marker.ours_content and marker.theirs_content:
|
|
461
|
-
suggestions.append(
|
|
461
|
+
suggestions.append(
|
|
462
|
+
f"Conflict {i + 1}: Accept incoming changes (theirs)"
|
|
463
|
+
)
|
|
462
464
|
elif marker.ours_content and not marker.theirs_content:
|
|
463
|
-
suggestions.append(f"Conflict {i+1}: Keep current changes (ours)")
|
|
465
|
+
suggestions.append(f"Conflict {i + 1}: Keep current changes (ours)")
|
|
464
466
|
elif self._only_whitespace_differences(
|
|
465
467
|
marker.ours_content, marker.theirs_content
|
|
466
468
|
):
|
|
467
469
|
suggestions.append(
|
|
468
|
-
f"Conflict {i+1}: Whitespace differences only - can auto-resolve"
|
|
470
|
+
f"Conflict {i + 1}: Whitespace differences only - can auto-resolve"
|
|
469
471
|
)
|
|
470
472
|
else:
|
|
471
|
-
suggestions.append(f"Conflict {i+1}: Manual merge required")
|
|
473
|
+
suggestions.append(f"Conflict {i + 1}: Manual merge required")
|
|
472
474
|
|
|
473
475
|
return "; ".join(suggestions)
|
|
474
476
|
|
|
@@ -307,9 +307,8 @@ class MermaidGeneratorService(SyncBaseService):
|
|
|
307
307
|
import_from = imp.get("from", imp.get("module", ""))
|
|
308
308
|
if import_from:
|
|
309
309
|
import_name = self._extract_module_name(import_from)
|
|
310
|
-
if (
|
|
311
|
-
|
|
312
|
-
and self._is_external_module(import_name)
|
|
310
|
+
if not config.include_external and self._is_external_module(
|
|
311
|
+
import_name
|
|
313
312
|
):
|
|
314
313
|
continue
|
|
315
314
|
modules.add(import_name)
|
claude_mpm/skills/__init__.py
CHANGED
|
@@ -30,13 +30,13 @@ from .skills_registry import SkillsRegistry as SkillsRegistryHelper
|
|
|
30
30
|
from .skills_service import SkillsService
|
|
31
31
|
|
|
32
32
|
__all__ = [
|
|
33
|
-
# New Skills Integration System
|
|
34
|
-
"SkillsService",
|
|
35
33
|
"AgentSkillsInjector",
|
|
36
|
-
"SkillsRegistryHelper",
|
|
37
34
|
# Legacy System
|
|
38
35
|
"Skill",
|
|
39
36
|
"SkillManager",
|
|
40
37
|
"SkillsRegistry",
|
|
38
|
+
"SkillsRegistryHelper",
|
|
39
|
+
# New Skills Integration System
|
|
40
|
+
"SkillsService",
|
|
41
41
|
"get_registry",
|
|
42
42
|
]
|