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.
- 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
|
@@ -199,7 +199,9 @@ class KuzuMemoryService(BaseToolAdapter):
|
|
|
199
199
|
try:
|
|
200
200
|
if action == "store":
|
|
201
201
|
result = await self.store_memory(
|
|
202
|
-
params.get("content"),
|
|
202
|
+
params.get("content"),
|
|
203
|
+
params.get("tags"),
|
|
204
|
+
{}, # metadata
|
|
203
205
|
)
|
|
204
206
|
elif action == "recall":
|
|
205
207
|
result = await self.recall_memories(
|
|
@@ -213,7 +215,9 @@ class KuzuMemoryService(BaseToolAdapter):
|
|
|
213
215
|
)
|
|
214
216
|
elif action == "context":
|
|
215
217
|
result = await self.get_context(
|
|
216
|
-
params.get("query", ""),
|
|
218
|
+
params.get("query", ""),
|
|
219
|
+
2,
|
|
220
|
+
True, # depth # include_related
|
|
217
221
|
)
|
|
218
222
|
else:
|
|
219
223
|
return MCPToolResult(success=False, error=f"Unknown action: {action}")
|
|
@@ -29,6 +29,7 @@ Example flow:
|
|
|
29
29
|
|
|
30
30
|
import logging
|
|
31
31
|
import re
|
|
32
|
+
import threading
|
|
32
33
|
from dataclasses import dataclass, field
|
|
33
34
|
from datetime import datetime, timezone
|
|
34
35
|
from typing import Dict, List, Optional, Tuple
|
|
@@ -536,6 +537,7 @@ class FailureTracker:
|
|
|
536
537
|
|
|
537
538
|
# Singleton instance for session-level tracking
|
|
538
539
|
_tracker_instance: Optional[FailureTracker] = None
|
|
540
|
+
_tracker_lock = threading.Lock()
|
|
539
541
|
|
|
540
542
|
|
|
541
543
|
def get_failure_tracker() -> FailureTracker:
|
|
@@ -544,13 +546,23 @@ def get_failure_tracker() -> FailureTracker:
|
|
|
544
546
|
WHY: Session-level tracking requires a singleton to maintain state
|
|
545
547
|
across multiple hook invocations during the same session.
|
|
546
548
|
|
|
549
|
+
Thread-safe implementation using double-checked locking pattern to
|
|
550
|
+
prevent race conditions during concurrent initialization.
|
|
551
|
+
|
|
547
552
|
Returns:
|
|
548
553
|
The FailureTracker singleton instance
|
|
549
554
|
"""
|
|
550
555
|
global _tracker_instance
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
556
|
+
|
|
557
|
+
# Fast path - check without lock
|
|
558
|
+
if _tracker_instance is not None:
|
|
559
|
+
return _tracker_instance
|
|
560
|
+
|
|
561
|
+
# Slow path - acquire lock and double-check
|
|
562
|
+
with _tracker_lock:
|
|
563
|
+
if _tracker_instance is None:
|
|
564
|
+
_tracker_instance = FailureTracker()
|
|
565
|
+
return _tracker_instance
|
|
554
566
|
|
|
555
567
|
|
|
556
568
|
def reset_failure_tracker() -> None:
|
|
@@ -558,6 +570,9 @@ def reset_failure_tracker() -> None:
|
|
|
558
570
|
|
|
559
571
|
WHY: Tests need to reset state between runs. Also useful for
|
|
560
572
|
explicitly starting a new tracking session.
|
|
573
|
+
|
|
574
|
+
Thread-safe implementation ensures proper cleanup.
|
|
561
575
|
"""
|
|
562
576
|
global _tracker_instance
|
|
563
|
-
|
|
577
|
+
with _tracker_lock:
|
|
578
|
+
_tracker_instance = None
|
|
@@ -618,7 +618,7 @@ class MemoryOptimizer(LoggerMixin):
|
|
|
618
618
|
)
|
|
619
619
|
|
|
620
620
|
# Check for similar items
|
|
621
|
-
|
|
621
|
+
_consolidated, consolidated_count = self._consolidate_similar_items(
|
|
622
622
|
unique_points
|
|
623
623
|
)
|
|
624
624
|
if consolidated_count > 0:
|
|
@@ -266,7 +266,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
266
266
|
|
|
267
267
|
# Route based on strategy
|
|
268
268
|
if self.strategy == RoutingStrategy.CLAUDE_ONLY:
|
|
269
|
-
return await self._route_to_claude(content, task, model, **kwargs)
|
|
269
|
+
return await self._route_to_claude(content, task, model=model, **kwargs)
|
|
270
270
|
|
|
271
271
|
if self.strategy in (
|
|
272
272
|
RoutingStrategy.OLLAMA_ONLY,
|
|
@@ -275,13 +275,13 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
275
275
|
return await self._route_to_ollama(
|
|
276
276
|
content,
|
|
277
277
|
task,
|
|
278
|
-
model,
|
|
278
|
+
model=model,
|
|
279
279
|
require_success=True,
|
|
280
280
|
**kwargs,
|
|
281
281
|
)
|
|
282
282
|
|
|
283
283
|
# AUTO strategy
|
|
284
|
-
return await self._route_auto(content, task, model, **kwargs)
|
|
284
|
+
return await self._route_auto(content, task, model=model, **kwargs)
|
|
285
285
|
|
|
286
286
|
async def _route_auto(
|
|
287
287
|
self,
|
|
@@ -308,7 +308,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
308
308
|
response = await self._route_to_ollama(
|
|
309
309
|
content,
|
|
310
310
|
task,
|
|
311
|
-
model,
|
|
311
|
+
model=model,
|
|
312
312
|
require_success=False,
|
|
313
313
|
**kwargs,
|
|
314
314
|
)
|
|
@@ -325,7 +325,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
325
325
|
# Ollama unavailable or failed - fallback to Claude
|
|
326
326
|
if self.fallback_enabled:
|
|
327
327
|
self.log_info("Falling back to Claude")
|
|
328
|
-
return await self._route_to_claude(content, task, model, **kwargs)
|
|
328
|
+
return await self._route_to_claude(content, task, model=model, **kwargs)
|
|
329
329
|
return self._create_error_response(
|
|
330
330
|
task,
|
|
331
331
|
model,
|
|
@@ -356,8 +356,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
356
356
|
if require_success and not await self.ollama_provider.is_available():
|
|
357
357
|
if self.strategy == RoutingStrategy.PRIVACY_FIRST:
|
|
358
358
|
error_msg = (
|
|
359
|
-
"Ollama not available. Privacy mode enabled - "
|
|
360
|
-
"not sending to cloud."
|
|
359
|
+
"Ollama not available. Privacy mode enabled - not sending to cloud."
|
|
361
360
|
)
|
|
362
361
|
else:
|
|
363
362
|
error_msg = "Ollama not available and required by configuration"
|
|
@@ -368,7 +367,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
368
367
|
self._route_count["ollama"] += 1
|
|
369
368
|
|
|
370
369
|
return await self.ollama_provider.analyze_content(
|
|
371
|
-
content, task, model, **kwargs
|
|
370
|
+
content, task, model=model, **kwargs
|
|
372
371
|
)
|
|
373
372
|
|
|
374
373
|
async def _route_to_claude(
|
|
@@ -394,7 +393,7 @@ class ModelRouter(BaseService, IModelRouter):
|
|
|
394
393
|
self._route_count["claude"] += 1
|
|
395
394
|
|
|
396
395
|
return await self.claude_provider.analyze_content(
|
|
397
|
-
content, task, model, **kwargs
|
|
396
|
+
content, task, model=model, **kwargs
|
|
398
397
|
)
|
|
399
398
|
|
|
400
399
|
def _create_error_response(
|
|
@@ -203,8 +203,8 @@ class UnifiedMonitorServer:
|
|
|
203
203
|
# Create Socket.IO server with proper ping configuration
|
|
204
204
|
self.sio = socketio.AsyncServer(
|
|
205
205
|
cors_allowed_origins="*",
|
|
206
|
-
logger=
|
|
207
|
-
engineio_logger=
|
|
206
|
+
logger=True, # Enable to see Socket.IO events and connection lifecycle
|
|
207
|
+
engineio_logger=True, # Enable to see Engine.IO protocol handshake details
|
|
208
208
|
ping_interval=30, # 30 seconds ping interval (matches client expectation)
|
|
209
209
|
ping_timeout=60, # 60 seconds ping timeout (generous for stability)
|
|
210
210
|
)
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"""Native Agent Converter Service
|
|
2
|
+
|
|
3
|
+
Converts MPM agent JSON definitions to Claude Code --agents flag format.
|
|
4
|
+
|
|
5
|
+
WHY: Claude Code 1.0.83+ supports native --agents flag for dynamic agent definition.
|
|
6
|
+
This allows agents to be passed directly via CLI instead of deployed to .claude/agents/.
|
|
7
|
+
|
|
8
|
+
DESIGN: Converts MPM agent schema → Claude native schema with field mappings:
|
|
9
|
+
- description → description (agent selection hint)
|
|
10
|
+
- system_instructions → prompt (agent behavior)
|
|
11
|
+
- allowed_tools → tools (tool limitations)
|
|
12
|
+
- model_tier → model (model selection)
|
|
13
|
+
|
|
14
|
+
USAGE:
|
|
15
|
+
converter = NativeAgentConverter()
|
|
16
|
+
agents_flag = converter.build_agents_flag(agent_configs)
|
|
17
|
+
# Returns: --agents '{"agent-name": {...}, ...}'
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import Any, Dict, List, Optional
|
|
23
|
+
|
|
24
|
+
from claude_mpm.core.logging_config import get_logger
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class NativeAgentConverter:
|
|
28
|
+
"""Converts MPM agent configurations to Claude Code --agents format."""
|
|
29
|
+
|
|
30
|
+
# Map MPM model tiers to Claude model names
|
|
31
|
+
MODEL_TIER_MAP = {
|
|
32
|
+
"opus": "opus",
|
|
33
|
+
"sonnet": "sonnet",
|
|
34
|
+
"haiku": "haiku",
|
|
35
|
+
"claude-3-opus": "opus",
|
|
36
|
+
"claude-3-sonnet": "sonnet",
|
|
37
|
+
"claude-3-haiku": "haiku",
|
|
38
|
+
"claude-3.5-sonnet": "sonnet",
|
|
39
|
+
"claude-4-sonnet": "sonnet",
|
|
40
|
+
"claude-4-opus": "opus",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
# Map MPM tool names to Claude tool names
|
|
44
|
+
TOOL_NAME_MAP = {
|
|
45
|
+
"Read": "Read",
|
|
46
|
+
"Write": "Write",
|
|
47
|
+
"Edit": "Edit",
|
|
48
|
+
"MultiEdit": "MultiEdit",
|
|
49
|
+
"Bash": "Bash",
|
|
50
|
+
"Grep": "Grep",
|
|
51
|
+
"Glob": "Glob",
|
|
52
|
+
"LS": "LS",
|
|
53
|
+
"WebSearch": "WebSearch",
|
|
54
|
+
"WebFetch": "WebFetch",
|
|
55
|
+
"TodoWrite": "TodoWrite",
|
|
56
|
+
"NotebookEdit": "NotebookEdit",
|
|
57
|
+
"BashOutput": "BashOutput",
|
|
58
|
+
"KillShell": "KillShell",
|
|
59
|
+
"AskUserQuestion": "AskUserQuestion",
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
def __init__(self):
|
|
63
|
+
"""Initialize the native agent converter."""
|
|
64
|
+
self.logger = get_logger(__name__)
|
|
65
|
+
|
|
66
|
+
def convert_mpm_agent_to_native(
|
|
67
|
+
self, agent_config: Dict[str, Any], agent_id: Optional[str] = None
|
|
68
|
+
) -> Dict[str, Any]:
|
|
69
|
+
"""Convert a single MPM agent config to Claude native format.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
agent_config: MPM agent JSON configuration
|
|
73
|
+
agent_id: Optional agent ID (falls back to agent_config['agent_id'])
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Dict with Claude native agent format:
|
|
77
|
+
{
|
|
78
|
+
"description": "...",
|
|
79
|
+
"prompt": "...",
|
|
80
|
+
"tools": [...],
|
|
81
|
+
"model": "sonnet"
|
|
82
|
+
}
|
|
83
|
+
"""
|
|
84
|
+
try:
|
|
85
|
+
# Extract agent ID
|
|
86
|
+
if not agent_id:
|
|
87
|
+
agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
|
|
88
|
+
|
|
89
|
+
# Extract description (for agent selection)
|
|
90
|
+
description = agent_config.get("description", "")
|
|
91
|
+
if not description and "metadata" in agent_config:
|
|
92
|
+
description = agent_config["metadata"].get("description", "")
|
|
93
|
+
|
|
94
|
+
# Build prompt from instructions and BASE_*.md reference
|
|
95
|
+
prompt = self._build_agent_prompt(agent_config)
|
|
96
|
+
|
|
97
|
+
# Extract and map tools
|
|
98
|
+
tools = self._extract_and_map_tools(agent_config)
|
|
99
|
+
|
|
100
|
+
# Map model tier
|
|
101
|
+
model = self._map_model_tier(agent_config)
|
|
102
|
+
|
|
103
|
+
native_config = {
|
|
104
|
+
"description": description,
|
|
105
|
+
"prompt": prompt,
|
|
106
|
+
"tools": tools,
|
|
107
|
+
"model": model,
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
self.logger.debug(f"Converted agent '{agent_id}' to native format")
|
|
111
|
+
return native_config
|
|
112
|
+
|
|
113
|
+
except Exception as e:
|
|
114
|
+
self.logger.error(f"Error converting agent {agent_id}: {e}")
|
|
115
|
+
# Return minimal valid config as fallback
|
|
116
|
+
return {
|
|
117
|
+
"description": f"Agent {agent_id}",
|
|
118
|
+
"prompt": agent_config.get("instructions", ""),
|
|
119
|
+
"tools": [],
|
|
120
|
+
"model": "sonnet",
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
def _build_agent_prompt(self, agent_config: Dict[str, Any]) -> str:
|
|
124
|
+
"""Build agent prompt from instructions and BASE_*.md reference.
|
|
125
|
+
|
|
126
|
+
OPTIMIZATION: Keep prompts concise for CLI argument length limits.
|
|
127
|
+
The BASE_*.md files contain full instructions, so we only need:
|
|
128
|
+
1. Reference to BASE file
|
|
129
|
+
2. Brief specialization note
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
agent_config: MPM agent configuration
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
Concise prompt string
|
|
136
|
+
"""
|
|
137
|
+
prompt_parts = []
|
|
138
|
+
|
|
139
|
+
# Add base instructions reference if available (most important)
|
|
140
|
+
if "knowledge" in agent_config:
|
|
141
|
+
base_file = agent_config["knowledge"].get("base_instructions_file")
|
|
142
|
+
if base_file:
|
|
143
|
+
prompt_parts.append(f"Follow {base_file} for all protocols.")
|
|
144
|
+
|
|
145
|
+
# Add main instructions (keep brief)
|
|
146
|
+
instructions = agent_config.get("instructions", "")
|
|
147
|
+
if instructions:
|
|
148
|
+
# Limit instruction length to avoid bloat
|
|
149
|
+
if len(instructions) > 300:
|
|
150
|
+
instructions = instructions[:300] + "..."
|
|
151
|
+
prompt_parts.append(instructions)
|
|
152
|
+
|
|
153
|
+
# Skip domain expertise and best practices for CLI mode
|
|
154
|
+
# These are already in BASE_*.md files referenced above
|
|
155
|
+
# Adding them here just bloats the JSON unnecessarily
|
|
156
|
+
|
|
157
|
+
return "\n".join(str(part) for part in prompt_parts if part)
|
|
158
|
+
|
|
159
|
+
def _extract_and_map_tools(self, agent_config: Dict[str, Any]) -> List[str]:
|
|
160
|
+
"""Extract and map tools from MPM config to Claude tool names.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
agent_config: MPM agent configuration
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
List of Claude tool names
|
|
167
|
+
"""
|
|
168
|
+
tools = []
|
|
169
|
+
|
|
170
|
+
# Check capabilities.tools
|
|
171
|
+
if "capabilities" in agent_config and "tools" in agent_config["capabilities"]:
|
|
172
|
+
mpm_tools = agent_config["capabilities"]["tools"]
|
|
173
|
+
for tool in mpm_tools:
|
|
174
|
+
mapped_tool = self.TOOL_NAME_MAP.get(tool, tool)
|
|
175
|
+
if mapped_tool not in tools:
|
|
176
|
+
tools.append(mapped_tool)
|
|
177
|
+
|
|
178
|
+
# If no tools specified, provide reasonable defaults
|
|
179
|
+
if not tools:
|
|
180
|
+
tools = ["Read", "Write", "Edit", "Bash", "Grep", "Glob"]
|
|
181
|
+
|
|
182
|
+
return tools
|
|
183
|
+
|
|
184
|
+
def _map_model_tier(self, agent_config: Dict[str, Any]) -> str:
|
|
185
|
+
"""Map MPM model tier to Claude model name.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
agent_config: MPM agent configuration
|
|
189
|
+
|
|
190
|
+
Returns:
|
|
191
|
+
Claude model name (opus, sonnet, haiku)
|
|
192
|
+
"""
|
|
193
|
+
# Check capabilities.model
|
|
194
|
+
if "capabilities" in agent_config and "model" in agent_config["capabilities"]:
|
|
195
|
+
model_tier = agent_config["capabilities"]["model"]
|
|
196
|
+
return self.MODEL_TIER_MAP.get(model_tier.lower(), "sonnet")
|
|
197
|
+
|
|
198
|
+
# Check metadata.model_preference
|
|
199
|
+
if (
|
|
200
|
+
"metadata" in agent_config
|
|
201
|
+
and "model_preference" in agent_config["metadata"]
|
|
202
|
+
):
|
|
203
|
+
model_tier = agent_config["metadata"]["model_preference"]
|
|
204
|
+
return self.MODEL_TIER_MAP.get(model_tier.lower(), "sonnet")
|
|
205
|
+
|
|
206
|
+
# Default to sonnet
|
|
207
|
+
return "sonnet"
|
|
208
|
+
|
|
209
|
+
def generate_agents_json(self, agents: List[Dict[str, Any]]) -> str:
|
|
210
|
+
"""Generate complete --agents JSON string from list of agent configs.
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
agents: List of MPM agent configurations
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
JSON string for --agents flag
|
|
217
|
+
"""
|
|
218
|
+
native_agents = {}
|
|
219
|
+
|
|
220
|
+
for agent_config in agents:
|
|
221
|
+
agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
|
|
222
|
+
if not agent_id:
|
|
223
|
+
self.logger.warning("Skipping agent without ID")
|
|
224
|
+
continue
|
|
225
|
+
|
|
226
|
+
# Skip PM agent (main Claude instance)
|
|
227
|
+
if agent_id.lower() in ["pm", "project_manager"]:
|
|
228
|
+
self.logger.debug(f"Skipping PM agent: {agent_id}")
|
|
229
|
+
continue
|
|
230
|
+
|
|
231
|
+
native_config = self.convert_mpm_agent_to_native(agent_config, agent_id)
|
|
232
|
+
native_agents[agent_id] = native_config
|
|
233
|
+
|
|
234
|
+
return json.dumps(native_agents, separators=(",", ":"))
|
|
235
|
+
|
|
236
|
+
def build_agents_flag(
|
|
237
|
+
self, agents: List[Dict[str, Any]], escape_for_shell: bool = True
|
|
238
|
+
) -> str:
|
|
239
|
+
"""Build complete --agents flag for CLI.
|
|
240
|
+
|
|
241
|
+
Args:
|
|
242
|
+
agents: List of MPM agent configurations
|
|
243
|
+
escape_for_shell: Whether to escape JSON for shell
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
Complete flag string: --agents '{"agent1": {...}, ...}'
|
|
247
|
+
"""
|
|
248
|
+
agents_json = self.generate_agents_json(agents)
|
|
249
|
+
|
|
250
|
+
# Check length (Claude CLI has argument length limits)
|
|
251
|
+
if len(agents_json) > 50000: # Conservative limit
|
|
252
|
+
self.logger.warning(
|
|
253
|
+
f"Agents JSON is very large ({len(agents_json)} chars). "
|
|
254
|
+
"Consider using file-based deployment."
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
if escape_for_shell:
|
|
258
|
+
# Escape for shell - wrap in single quotes
|
|
259
|
+
return f"--agents '{agents_json}'"
|
|
260
|
+
|
|
261
|
+
return f"--agents {agents_json}"
|
|
262
|
+
|
|
263
|
+
def load_agents_from_templates(
|
|
264
|
+
self, templates_dir: Optional[Path] = None
|
|
265
|
+
) -> List[Dict[str, Any]]:
|
|
266
|
+
"""Load all agent configs from templates directory.
|
|
267
|
+
|
|
268
|
+
Args:
|
|
269
|
+
templates_dir: Path to templates directory (defaults to MPM agents)
|
|
270
|
+
|
|
271
|
+
Returns:
|
|
272
|
+
List of agent configurations
|
|
273
|
+
"""
|
|
274
|
+
if not templates_dir:
|
|
275
|
+
# Default to MPM agents directory
|
|
276
|
+
mpm_package_dir = Path(__file__).parent.parent / "agents" / "templates"
|
|
277
|
+
templates_dir = mpm_package_dir
|
|
278
|
+
|
|
279
|
+
if not templates_dir.exists():
|
|
280
|
+
self.logger.warning(f"Templates directory not found: {templates_dir}")
|
|
281
|
+
return []
|
|
282
|
+
|
|
283
|
+
agents = []
|
|
284
|
+
json_files = list(templates_dir.glob("*.json"))
|
|
285
|
+
|
|
286
|
+
self.logger.info(
|
|
287
|
+
f"Loading {len(json_files)} agent templates from {templates_dir}"
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
for json_file in json_files:
|
|
291
|
+
try:
|
|
292
|
+
# Skip base_agent.json
|
|
293
|
+
if json_file.stem == "base_agent":
|
|
294
|
+
continue
|
|
295
|
+
|
|
296
|
+
agent_config = json.loads(json_file.read_text())
|
|
297
|
+
agents.append(agent_config)
|
|
298
|
+
self.logger.debug(f"Loaded agent: {json_file.stem}")
|
|
299
|
+
|
|
300
|
+
except Exception as e:
|
|
301
|
+
self.logger.error(f"Error loading agent {json_file.name}: {e}")
|
|
302
|
+
continue
|
|
303
|
+
|
|
304
|
+
return agents
|
|
305
|
+
|
|
306
|
+
def estimate_json_size(self, agents: List[Dict[str, Any]]) -> int:
|
|
307
|
+
"""Estimate the size of --agents JSON output.
|
|
308
|
+
|
|
309
|
+
Args:
|
|
310
|
+
agents: List of agent configurations
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
Estimated size in bytes
|
|
314
|
+
"""
|
|
315
|
+
agents_json = self.generate_agents_json(agents)
|
|
316
|
+
return len(agents_json.encode("utf-8"))
|
|
317
|
+
|
|
318
|
+
def get_conversion_summary(self, agents: List[Dict[str, Any]]) -> Dict[str, Any]:
|
|
319
|
+
"""Get summary of agent conversion for reporting.
|
|
320
|
+
|
|
321
|
+
Args:
|
|
322
|
+
agents: List of agent configurations
|
|
323
|
+
|
|
324
|
+
Returns:
|
|
325
|
+
Summary dict with counts and size info
|
|
326
|
+
"""
|
|
327
|
+
native_agents = {}
|
|
328
|
+
model_counts = {"opus": 0, "sonnet": 0, "haiku": 0}
|
|
329
|
+
tool_usage = {}
|
|
330
|
+
|
|
331
|
+
for agent_config in agents:
|
|
332
|
+
agent_id = agent_config.get("agent_id") or agent_config.get("name", "")
|
|
333
|
+
if not agent_id or agent_id.lower() in ["pm", "project_manager"]:
|
|
334
|
+
continue
|
|
335
|
+
|
|
336
|
+
native_config = self.convert_mpm_agent_to_native(agent_config, agent_id)
|
|
337
|
+
native_agents[agent_id] = native_config
|
|
338
|
+
|
|
339
|
+
# Count models
|
|
340
|
+
model = native_config.get("model", "sonnet")
|
|
341
|
+
model_counts[model] = model_counts.get(model, 0) + 1
|
|
342
|
+
|
|
343
|
+
# Count tools
|
|
344
|
+
for tool in native_config.get("tools", []):
|
|
345
|
+
tool_usage[tool] = tool_usage.get(tool, 0) + 1
|
|
346
|
+
|
|
347
|
+
json_size = len(json.dumps(native_agents, separators=(",", ":")))
|
|
348
|
+
|
|
349
|
+
return {
|
|
350
|
+
"total_agents": len(native_agents),
|
|
351
|
+
"json_size": json_size,
|
|
352
|
+
"json_size_kb": round(json_size / 1024, 2),
|
|
353
|
+
"model_distribution": model_counts,
|
|
354
|
+
"tool_usage": tool_usage,
|
|
355
|
+
"agents": list(native_agents.keys()),
|
|
356
|
+
}
|
|
@@ -431,7 +431,7 @@ class PortManager:
|
|
|
431
431
|
return port
|
|
432
432
|
|
|
433
433
|
self.logger.error(
|
|
434
|
-
f"No available ports in range {self.PORT_RANGE.start}-{self.PORT_RANGE.stop-1}"
|
|
434
|
+
f"No available ports in range {self.PORT_RANGE.start}-{self.PORT_RANGE.stop - 1}"
|
|
435
435
|
)
|
|
436
436
|
return None
|
|
437
437
|
|
|
@@ -369,7 +369,8 @@ class DocumentationManager:
|
|
|
369
369
|
sorted_sections = sorted(
|
|
370
370
|
sections.items(),
|
|
371
371
|
key=lambda x: self.SECTION_PRIORITY.get(
|
|
372
|
-
self._get_section_key(x[0]),
|
|
372
|
+
self._get_section_key(x[0]),
|
|
373
|
+
50, # Default priority
|
|
373
374
|
),
|
|
374
375
|
reverse=True, # Higher priority first
|
|
375
376
|
)
|
|
@@ -318,7 +318,9 @@ class ToolchainAnalyzerService(BaseService, IToolchainAnalyzer):
|
|
|
318
318
|
else (
|
|
319
319
|
3
|
|
320
320
|
if f.confidence == ConfidenceLevel.MEDIUM
|
|
321
|
-
else 2
|
|
321
|
+
else 2
|
|
322
|
+
if f.confidence == ConfidenceLevel.LOW
|
|
323
|
+
else 1
|
|
322
324
|
)
|
|
323
325
|
),
|
|
324
326
|
f.popularity_score,
|
|
@@ -168,6 +168,7 @@ class RunnerConfigurationService(BaseService, RunnerConfigurationInterface):
|
|
|
168
168
|
"launch_method": kwargs.get("launch_method", "exec"),
|
|
169
169
|
"enable_websocket": kwargs.get("enable_websocket", False),
|
|
170
170
|
"websocket_port": kwargs.get("websocket_port", 8765),
|
|
171
|
+
"use_native_agents": kwargs.get("use_native_agents", False),
|
|
171
172
|
}
|
|
172
173
|
|
|
173
174
|
# Initialize main configuration using ConfigLoader
|