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
|
@@ -63,7 +63,9 @@ class SkillsService(LoggerMixin):
|
|
|
63
63
|
self.bundled_skills_path: Path = Path(__file__).parent / "bundled"
|
|
64
64
|
self.deployed_skills_path: Path = self.project_root / ".claude" / "skills"
|
|
65
65
|
self.registry_path: Path = (
|
|
66
|
-
Path(__file__).parent.parent.parent.parent
|
|
66
|
+
Path(__file__).parent.parent.parent.parent
|
|
67
|
+
/ "config"
|
|
68
|
+
/ "skills_registry.yaml"
|
|
67
69
|
)
|
|
68
70
|
|
|
69
71
|
# Load registry
|
|
@@ -139,7 +141,7 @@ class SkillsService(LoggerMixin):
|
|
|
139
141
|
return {}
|
|
140
142
|
|
|
141
143
|
try:
|
|
142
|
-
with open(self.registry_path, encoding=
|
|
144
|
+
with open(self.registry_path, encoding="utf-8") as f:
|
|
143
145
|
registry = yaml.safe_load(f)
|
|
144
146
|
if not registry:
|
|
145
147
|
self.logger.warning(f"Empty registry file: {self.registry_path}")
|
|
@@ -176,11 +178,13 @@ class SkillsService(LoggerMixin):
|
|
|
176
178
|
skills = []
|
|
177
179
|
|
|
178
180
|
if not self.bundled_skills_path.exists():
|
|
179
|
-
self.logger.warning(
|
|
181
|
+
self.logger.warning(
|
|
182
|
+
f"Bundled skills path not found: {self.bundled_skills_path}"
|
|
183
|
+
)
|
|
180
184
|
return skills
|
|
181
185
|
|
|
182
186
|
for category_dir in self.bundled_skills_path.iterdir():
|
|
183
|
-
if not category_dir.is_dir() or category_dir.name.startswith(
|
|
187
|
+
if not category_dir.is_dir() or category_dir.name.startswith("."):
|
|
184
188
|
continue
|
|
185
189
|
|
|
186
190
|
for skill_dir in category_dir.iterdir():
|
|
@@ -190,12 +194,14 @@ class SkillsService(LoggerMixin):
|
|
|
190
194
|
skill_md = skill_dir / "SKILL.md"
|
|
191
195
|
if skill_md.exists():
|
|
192
196
|
metadata = self._parse_skill_metadata(skill_md)
|
|
193
|
-
skills.append(
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
197
|
+
skills.append(
|
|
198
|
+
{
|
|
199
|
+
"name": skill_dir.name,
|
|
200
|
+
"category": category_dir.name,
|
|
201
|
+
"path": skill_dir,
|
|
202
|
+
"metadata": metadata,
|
|
203
|
+
}
|
|
204
|
+
)
|
|
199
205
|
|
|
200
206
|
self.logger.info(f"Discovered {len(skills)} bundled skills")
|
|
201
207
|
return skills
|
|
@@ -220,10 +226,10 @@ class SkillsService(LoggerMixin):
|
|
|
220
226
|
Dict containing frontmatter metadata, or empty dict if parsing fails
|
|
221
227
|
"""
|
|
222
228
|
try:
|
|
223
|
-
content = skill_md.read_text(encoding=
|
|
229
|
+
content = skill_md.read_text(encoding="utf-8")
|
|
224
230
|
|
|
225
231
|
# Match YAML frontmatter: ---\n...yaml...\n---
|
|
226
|
-
match = re.match(r
|
|
232
|
+
match = re.match(r"^---\n(.*?)\n---", content, re.DOTALL)
|
|
227
233
|
|
|
228
234
|
if not match:
|
|
229
235
|
self.logger.warning(f"No YAML frontmatter found in {skill_md}")
|
|
@@ -233,7 +239,9 @@ class SkillsService(LoggerMixin):
|
|
|
233
239
|
metadata = yaml.safe_load(match.group(1))
|
|
234
240
|
return metadata or {}
|
|
235
241
|
except yaml.YAMLError as e:
|
|
236
|
-
self.logger.error(
|
|
242
|
+
self.logger.error(
|
|
243
|
+
f"Failed to parse YAML frontmatter in {skill_md}: {e}"
|
|
244
|
+
)
|
|
237
245
|
return {}
|
|
238
246
|
except Exception as e:
|
|
239
247
|
self.logger.error(f"Failed to read skill file {skill_md}: {e}")
|
|
@@ -270,11 +278,11 @@ class SkillsService(LoggerMixin):
|
|
|
270
278
|
for skill in skills:
|
|
271
279
|
try:
|
|
272
280
|
# Create category directory in deployment location
|
|
273
|
-
target_category_dir = self.deployed_skills_path / skill[
|
|
281
|
+
target_category_dir = self.deployed_skills_path / skill["category"]
|
|
274
282
|
target_category_dir.mkdir(parents=True, exist_ok=True)
|
|
275
283
|
|
|
276
284
|
# Target path for this skill
|
|
277
|
-
target_dir = target_category_dir / skill[
|
|
285
|
+
target_dir = target_category_dir / skill["name"]
|
|
278
286
|
|
|
279
287
|
# SECURITY: Validate path is within deployed_skills_path
|
|
280
288
|
if not self._validate_safe_path(self.deployed_skills_path, target_dir):
|
|
@@ -282,15 +290,19 @@ class SkillsService(LoggerMixin):
|
|
|
282
290
|
|
|
283
291
|
# Check if already deployed
|
|
284
292
|
if target_dir.exists() and not force:
|
|
285
|
-
skipped.append(skill[
|
|
293
|
+
skipped.append(skill["name"])
|
|
286
294
|
self.logger.debug(f"Skipped {skill['name']} (already deployed)")
|
|
287
295
|
continue
|
|
288
296
|
|
|
289
297
|
# Deploy skill
|
|
290
298
|
if target_dir.exists():
|
|
291
299
|
# SECURITY: Verify again before deletion and check for symlinks
|
|
292
|
-
if not self._validate_safe_path(
|
|
293
|
-
|
|
300
|
+
if not self._validate_safe_path(
|
|
301
|
+
self.deployed_skills_path, target_dir
|
|
302
|
+
):
|
|
303
|
+
raise ValueError(
|
|
304
|
+
"Refusing to delete path outside skills directory"
|
|
305
|
+
)
|
|
294
306
|
|
|
295
307
|
if target_dir.is_symlink():
|
|
296
308
|
self.logger.warning(f"Refusing to delete symlink: {target_dir}")
|
|
@@ -298,25 +310,21 @@ class SkillsService(LoggerMixin):
|
|
|
298
310
|
else:
|
|
299
311
|
shutil.rmtree(target_dir)
|
|
300
312
|
|
|
301
|
-
shutil.copytree(skill[
|
|
313
|
+
shutil.copytree(skill["path"], target_dir)
|
|
302
314
|
|
|
303
|
-
deployed.append(skill[
|
|
315
|
+
deployed.append(skill["name"])
|
|
304
316
|
self.logger.debug(f"Deployed skill: {skill['name']}")
|
|
305
317
|
|
|
306
318
|
except (ValueError, OSError) as e:
|
|
307
319
|
self.logger.error(f"Failed to deploy {skill['name']}: {e}")
|
|
308
|
-
errors.append({
|
|
320
|
+
errors.append({"skill": skill["name"], "error": str(e)})
|
|
309
321
|
|
|
310
322
|
self.logger.info(
|
|
311
323
|
f"Skills deployment: {len(deployed)} deployed, "
|
|
312
324
|
f"{len(skipped)} skipped, {len(errors)} errors"
|
|
313
325
|
)
|
|
314
326
|
|
|
315
|
-
return {
|
|
316
|
-
'deployed': deployed,
|
|
317
|
-
'skipped': skipped,
|
|
318
|
-
'errors': errors
|
|
319
|
-
}
|
|
327
|
+
return {"deployed": deployed, "skipped": skipped, "errors": errors}
|
|
320
328
|
|
|
321
329
|
def get_skills_for_agent(self, agent_id: str) -> List[str]:
|
|
322
330
|
"""Get list of skills assigned to specific agent.
|
|
@@ -334,14 +342,14 @@ class SkillsService(LoggerMixin):
|
|
|
334
342
|
>>> skills = service.get_skills_for_agent('engineer')
|
|
335
343
|
>>> # Returns: ['test-driven-development', 'systematic-debugging', ...]
|
|
336
344
|
"""
|
|
337
|
-
if
|
|
345
|
+
if "agent_skills" not in self.registry:
|
|
338
346
|
return []
|
|
339
347
|
|
|
340
|
-
agent_skills = self.registry[
|
|
348
|
+
agent_skills = self.registry["agent_skills"].get(agent_id, {})
|
|
341
349
|
|
|
342
350
|
# Combine required and optional skills
|
|
343
|
-
required = agent_skills.get(
|
|
344
|
-
optional = agent_skills.get(
|
|
351
|
+
required = agent_skills.get("required", [])
|
|
352
|
+
optional = agent_skills.get("optional", [])
|
|
345
353
|
|
|
346
354
|
return required + optional
|
|
347
355
|
|
|
@@ -366,10 +374,7 @@ class SkillsService(LoggerMixin):
|
|
|
366
374
|
- metadata: Parsed metadata (if valid)
|
|
367
375
|
"""
|
|
368
376
|
# Find skill in deployed or bundled paths
|
|
369
|
-
skill_paths = [
|
|
370
|
-
self.deployed_skills_path,
|
|
371
|
-
self.bundled_skills_path
|
|
372
|
-
]
|
|
377
|
+
skill_paths = [self.deployed_skills_path, self.bundled_skills_path]
|
|
373
378
|
|
|
374
379
|
for base_path in skill_paths:
|
|
375
380
|
if not base_path.exists():
|
|
@@ -384,9 +389,9 @@ class SkillsService(LoggerMixin):
|
|
|
384
389
|
return self._validate_skill_structure(skill_dir)
|
|
385
390
|
|
|
386
391
|
return {
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
392
|
+
"valid": False,
|
|
393
|
+
"errors": [f"Skill not found: {skill_name}"],
|
|
394
|
+
"warnings": [],
|
|
390
395
|
}
|
|
391
396
|
|
|
392
397
|
def _validate_skill_structure(self, skill_dir: Path) -> Dict[str, Any]:
|
|
@@ -413,40 +418,40 @@ class SkillsService(LoggerMixin):
|
|
|
413
418
|
skill_md = skill_dir / "SKILL.md"
|
|
414
419
|
if not skill_md.exists():
|
|
415
420
|
errors.append("Missing SKILL.md")
|
|
416
|
-
return {
|
|
417
|
-
'valid': False,
|
|
418
|
-
'errors': errors,
|
|
419
|
-
'warnings': warnings
|
|
420
|
-
}
|
|
421
|
+
return {"valid": False, "errors": errors, "warnings": warnings}
|
|
421
422
|
|
|
422
423
|
# Parse and validate metadata
|
|
423
424
|
metadata = self._parse_skill_metadata(skill_md)
|
|
424
425
|
|
|
425
426
|
if not metadata:
|
|
426
427
|
errors.append("Missing or invalid YAML frontmatter")
|
|
427
|
-
return {
|
|
428
|
-
'valid': False,
|
|
429
|
-
'errors': errors,
|
|
430
|
-
'warnings': warnings
|
|
431
|
-
}
|
|
428
|
+
return {"valid": False, "errors": errors, "warnings": warnings}
|
|
432
429
|
|
|
433
430
|
# Rule 5: Required fields
|
|
434
|
-
required_fields = [
|
|
431
|
+
required_fields = [
|
|
432
|
+
"name",
|
|
433
|
+
"description",
|
|
434
|
+
"version",
|
|
435
|
+
"category",
|
|
436
|
+
"progressive_disclosure",
|
|
437
|
+
]
|
|
435
438
|
for field in required_fields:
|
|
436
439
|
if field not in metadata:
|
|
437
440
|
errors.append(f"Missing required field: {field}")
|
|
438
441
|
|
|
439
442
|
# Rule 6: Name format
|
|
440
|
-
if
|
|
441
|
-
name = metadata[
|
|
442
|
-
if not re.match(r
|
|
443
|
+
if "name" in metadata:
|
|
444
|
+
name = metadata["name"]
|
|
445
|
+
if not re.match(r"^[a-z][a-z0-9-]*[a-z0-9]$", name):
|
|
443
446
|
errors.append(f"Invalid name format: {name}")
|
|
444
447
|
|
|
445
448
|
# Rule 8: Description length
|
|
446
|
-
if
|
|
447
|
-
desc_len = len(metadata[
|
|
449
|
+
if "description" in metadata:
|
|
450
|
+
desc_len = len(metadata["description"])
|
|
448
451
|
if desc_len < 10 or desc_len > 150:
|
|
449
|
-
errors.append(
|
|
452
|
+
errors.append(
|
|
453
|
+
f"Description must be 10-150 characters (found {desc_len})"
|
|
454
|
+
)
|
|
450
455
|
|
|
451
456
|
# Check for optional directories
|
|
452
457
|
if (skill_dir / "scripts").exists():
|
|
@@ -456,10 +461,10 @@ class SkillsService(LoggerMixin):
|
|
|
456
461
|
warnings.append("Contains references/ directory")
|
|
457
462
|
|
|
458
463
|
return {
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
464
|
+
"valid": len(errors) == 0,
|
|
465
|
+
"errors": errors,
|
|
466
|
+
"warnings": warnings,
|
|
467
|
+
"metadata": metadata,
|
|
463
468
|
}
|
|
464
469
|
|
|
465
470
|
def check_for_updates(self) -> Dict[str, Any]:
|
|
@@ -477,7 +482,7 @@ class SkillsService(LoggerMixin):
|
|
|
477
482
|
- not_deployed: List of skill names (in bundled, not deployed)
|
|
478
483
|
- orphaned: List of skill names (in deployed, not bundled)
|
|
479
484
|
"""
|
|
480
|
-
bundled = {s[
|
|
485
|
+
bundled = {s["name"]: s for s in self.discover_bundled_skills()}
|
|
481
486
|
|
|
482
487
|
# Discover deployed skills
|
|
483
488
|
deployed = {}
|
|
@@ -494,10 +499,10 @@ class SkillsService(LoggerMixin):
|
|
|
494
499
|
if skill_md.exists():
|
|
495
500
|
metadata = self._parse_skill_metadata(skill_md)
|
|
496
501
|
deployed[skill_dir.name] = {
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
502
|
+
"name": skill_dir.name,
|
|
503
|
+
"category": category_dir.name,
|
|
504
|
+
"path": skill_dir,
|
|
505
|
+
"metadata": metadata,
|
|
501
506
|
}
|
|
502
507
|
|
|
503
508
|
updates_available = []
|
|
@@ -507,19 +512,21 @@ class SkillsService(LoggerMixin):
|
|
|
507
512
|
|
|
508
513
|
# Check for updates
|
|
509
514
|
for name, bundled_skill in bundled.items():
|
|
510
|
-
bundled_version = bundled_skill[
|
|
515
|
+
bundled_version = bundled_skill["metadata"].get("version", "0.0.0")
|
|
511
516
|
|
|
512
517
|
if name not in deployed:
|
|
513
518
|
not_deployed.append(name)
|
|
514
519
|
else:
|
|
515
|
-
deployed_version = deployed[name][
|
|
520
|
+
deployed_version = deployed[name]["metadata"].get("version", "0.0.0")
|
|
516
521
|
|
|
517
522
|
if deployed_version != bundled_version:
|
|
518
|
-
updates_available.append(
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
+
updates_available.append(
|
|
524
|
+
{
|
|
525
|
+
"name": name,
|
|
526
|
+
"current_version": deployed_version,
|
|
527
|
+
"new_version": bundled_version,
|
|
528
|
+
}
|
|
529
|
+
)
|
|
523
530
|
else:
|
|
524
531
|
up_to_date.append(name)
|
|
525
532
|
|
|
@@ -529,10 +536,10 @@ class SkillsService(LoggerMixin):
|
|
|
529
536
|
orphaned.append(name)
|
|
530
537
|
|
|
531
538
|
return {
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
539
|
+
"updates_available": updates_available,
|
|
540
|
+
"up_to_date": up_to_date,
|
|
541
|
+
"not_deployed": not_deployed,
|
|
542
|
+
"orphaned": orphaned,
|
|
536
543
|
}
|
|
537
544
|
|
|
538
545
|
def update_skills(self, skill_names: Optional[List[str]] = None) -> Dict[str, Any]:
|
|
@@ -552,28 +559,29 @@ class SkillsService(LoggerMixin):
|
|
|
552
559
|
if skill_names is None:
|
|
553
560
|
# Get all skills with available updates
|
|
554
561
|
check_result = self.check_for_updates()
|
|
555
|
-
skill_names = [s[
|
|
562
|
+
skill_names = [s["name"] for s in check_result["updates_available"]]
|
|
556
563
|
|
|
557
564
|
if not skill_names:
|
|
558
565
|
self.logger.info("No skills to update")
|
|
559
|
-
return {
|
|
566
|
+
return {"updated": [], "errors": []}
|
|
560
567
|
|
|
561
568
|
updated = []
|
|
562
569
|
errors = []
|
|
563
570
|
|
|
564
|
-
bundled = {s[
|
|
571
|
+
bundled = {s["name"]: s for s in self.discover_bundled_skills()}
|
|
565
572
|
|
|
566
573
|
for skill_name in skill_names:
|
|
567
574
|
if skill_name not in bundled:
|
|
568
|
-
errors.append(
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
})
|
|
575
|
+
errors.append(
|
|
576
|
+
{"skill": skill_name, "error": "Skill not found in bundled skills"}
|
|
577
|
+
)
|
|
572
578
|
continue
|
|
573
579
|
|
|
574
580
|
try:
|
|
575
581
|
skill = bundled[skill_name]
|
|
576
|
-
target_dir =
|
|
582
|
+
target_dir = (
|
|
583
|
+
self.deployed_skills_path / skill["category"] / skill["name"]
|
|
584
|
+
)
|
|
577
585
|
|
|
578
586
|
# SECURITY: Validate path is within deployed_skills_path
|
|
579
587
|
if not self._validate_safe_path(self.deployed_skills_path, target_dir):
|
|
@@ -590,21 +598,20 @@ class SkillsService(LoggerMixin):
|
|
|
590
598
|
|
|
591
599
|
# Deploy new version
|
|
592
600
|
target_dir.parent.mkdir(parents=True, exist_ok=True)
|
|
593
|
-
shutil.copytree(skill[
|
|
601
|
+
shutil.copytree(skill["path"], target_dir)
|
|
594
602
|
|
|
595
603
|
updated.append(skill_name)
|
|
596
604
|
self.logger.info(f"Updated skill: {skill_name}")
|
|
597
605
|
|
|
598
606
|
except (ValueError, OSError) as e:
|
|
599
|
-
errors.append({
|
|
607
|
+
errors.append({"skill": skill_name, "error": str(e)})
|
|
600
608
|
self.logger.error(f"Failed to update {skill_name}: {e}")
|
|
601
609
|
|
|
602
|
-
return {
|
|
603
|
-
'updated': updated,
|
|
604
|
-
'errors': errors
|
|
605
|
-
}
|
|
610
|
+
return {"updated": updated, "errors": errors}
|
|
606
611
|
|
|
607
|
-
def install_updates(
|
|
612
|
+
def install_updates(
|
|
613
|
+
self, updates: List[Dict[str, Any]], force: bool = False
|
|
614
|
+
) -> Dict[str, Any]:
|
|
608
615
|
"""Install skill updates from update check results.
|
|
609
616
|
|
|
610
617
|
Args:
|
|
@@ -614,7 +621,7 @@ class SkillsService(LoggerMixin):
|
|
|
614
621
|
Returns:
|
|
615
622
|
Dict containing updated skills and errors
|
|
616
623
|
"""
|
|
617
|
-
skill_names = [update[
|
|
624
|
+
skill_names = [update["skill"] for update in updates]
|
|
618
625
|
return self.update_skills(skill_names)
|
|
619
626
|
|
|
620
627
|
def get_skill_path(self, skill_name: str) -> Optional[Path]:
|
|
@@ -647,20 +654,20 @@ class SkillsService(LoggerMixin):
|
|
|
647
654
|
Dict with extracted metadata
|
|
648
655
|
"""
|
|
649
656
|
metadata = {}
|
|
650
|
-
lines = content.split(
|
|
657
|
+
lines = content.split("\n")
|
|
651
658
|
|
|
652
659
|
for line in lines[:50]: # Check first 50 lines for metadata
|
|
653
660
|
line = line.strip()
|
|
654
661
|
|
|
655
662
|
# Parse YAML-style metadata
|
|
656
|
-
if line.startswith(
|
|
657
|
-
metadata[
|
|
658
|
-
elif line.startswith(
|
|
659
|
-
metadata[
|
|
660
|
-
elif line.startswith(
|
|
661
|
-
metadata[
|
|
662
|
-
elif line.startswith(
|
|
663
|
-
metadata[
|
|
663
|
+
if line.startswith("version:"):
|
|
664
|
+
metadata["version"] = line.split(":", 1)[1].strip()
|
|
665
|
+
elif line.startswith("description:"):
|
|
666
|
+
metadata["description"] = line.split(":", 1)[1].strip()
|
|
667
|
+
elif line.startswith("category:"):
|
|
668
|
+
metadata["category"] = line.split(":", 1)[1].strip()
|
|
669
|
+
elif line.startswith("source:"):
|
|
670
|
+
metadata["source"] = line.split(":", 1)[1].strip()
|
|
664
671
|
|
|
665
672
|
return metadata
|
|
666
673
|
|
|
@@ -676,10 +683,10 @@ class SkillsService(LoggerMixin):
|
|
|
676
683
|
agents = []
|
|
677
684
|
registry = self._load_registry()
|
|
678
685
|
|
|
679
|
-
agent_capabilities = registry.get(
|
|
686
|
+
agent_capabilities = registry.get("agent_capabilities", {})
|
|
680
687
|
for agent_id, capabilities in agent_capabilities.items():
|
|
681
|
-
primary_workflows = capabilities.get(
|
|
682
|
-
enhanced_capabilities = capabilities.get(
|
|
688
|
+
primary_workflows = capabilities.get("primary_workflows", [])
|
|
689
|
+
enhanced_capabilities = capabilities.get("enhanced_capabilities", [])
|
|
683
690
|
all_skills = primary_workflows + enhanced_capabilities
|
|
684
691
|
|
|
685
692
|
if skill_name in all_skills:
|
|
@@ -698,7 +705,11 @@ class SkillsService(LoggerMixin):
|
|
|
698
705
|
"""
|
|
699
706
|
if scope == "system":
|
|
700
707
|
# System-wide config (bundled)
|
|
701
|
-
return
|
|
708
|
+
return (
|
|
709
|
+
self.bundled_skills_path.parent.parent
|
|
710
|
+
/ "config"
|
|
711
|
+
/ "skills_registry.yaml"
|
|
712
|
+
)
|
|
702
713
|
if scope == "user":
|
|
703
714
|
# User config (~/.config/claude-mpm/)
|
|
704
715
|
home = Path.home()
|
|
@@ -718,13 +729,11 @@ class SkillsService(LoggerMixin):
|
|
|
718
729
|
config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
719
730
|
|
|
720
731
|
default_config = {
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
'auto_deploy': True,
|
|
724
|
-
'update_check': True
|
|
725
|
-
}
|
|
732
|
+
"version": "2.0.0",
|
|
733
|
+
"skills": {"auto_deploy": True, "update_check": True},
|
|
726
734
|
}
|
|
727
735
|
|
|
728
736
|
import yaml
|
|
737
|
+
|
|
729
738
|
config_path.write_text(yaml.dump(default_config, default_flow_style=False))
|
|
730
739
|
self.logger.info(f"Created default config at {config_path}")
|