claude-mpm 5.0.2__py3-none-any.whl → 5.4.3__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/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1218 -905
- claude_mpm/agents/agent_loader.py +10 -17
- claude_mpm/agents/base_agent_loader.py +10 -35
- claude_mpm/agents/frontmatter_validator.py +68 -0
- claude_mpm/agents/templates/circuit-breakers.md +431 -45
- claude_mpm/cli/__init__.py +0 -1
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_state_manager.py +67 -23
- claude_mpm/cli/commands/agents.py +446 -25
- claude_mpm/cli/commands/auto_configure.py +535 -233
- claude_mpm/cli/commands/configure.py +1500 -147
- claude_mpm/cli/commands/configure_agent_display.py +13 -6
- claude_mpm/cli/commands/mpm_init/core.py +158 -1
- claude_mpm/cli/commands/mpm_init/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +280 -0
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +1 -39
- claude_mpm/cli/commands/skills.py +322 -19
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/executor.py +8 -0
- claude_mpm/cli/interactive/agent_wizard.py +302 -195
- claude_mpm/cli/parsers/agents_parser.py +137 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
- claude_mpm/cli/parsers/base_parser.py +9 -0
- claude_mpm/cli/parsers/skills_parser.py +7 -0
- claude_mpm/cli/startup.py +133 -85
- claude_mpm/commands/mpm-agents-auto-configure.md +2 -2
- claude_mpm/commands/mpm-agents-list.md +2 -2
- claude_mpm/commands/mpm-config-view.md +2 -2
- claude_mpm/commands/mpm-help.md +3 -0
- claude_mpm/commands/{mpm-ticket-organize.md → mpm-organize.md} +4 -5
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/mpm-session-resume.md +2 -2
- claude_mpm/commands/mpm-ticket-view.md +2 -2
- claude_mpm/config/agent_presets.py +312 -82
- claude_mpm/config/agent_sources.py +27 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/constants.py +1 -0
- claude_mpm/core/claude_runner.py +2 -25
- claude_mpm/core/framework/loaders/agent_loader.py +8 -5
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/interactive_session.py +19 -5
- claude_mpm/core/oneshot_session.py +16 -4
- claude_mpm/core/output_style_manager.py +173 -43
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +3 -3
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_agent_registry.py +134 -16
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +35 -2
- claude_mpm/hooks/claude_hooks/hook_handler.py +4 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +4 -0
- claude_mpm/models/agent_definition.py +7 -0
- claude_mpm/scripts/launch_monitor.py +93 -13
- claude_mpm/services/agents/agent_recommendation_service.py +279 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +3 -2
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +110 -3
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +518 -55
- claude_mpm/services/agents/git_source_manager.py +20 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +45 -6
- claude_mpm/services/agents/toolchain_detector.py +6 -5
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/command_deployment_service.py +106 -5
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/event_bus/config.py +3 -1
- claude_mpm/services/git/git_operations_service.py +8 -8
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/monitor/daemon.py +37 -10
- claude_mpm/services/monitor/daemon_manager.py +134 -21
- claude_mpm/services/monitor/server.py +225 -19
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/socketio/event_normalizer.py +15 -1
- claude_mpm/services/socketio/server/core.py +160 -21
- claude_mpm/services/version_control/git_operations.py +103 -0
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/gitignore.py +3 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +5 -1
- {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/METADATA +69 -84
- {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/RECORD +112 -153
- {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/entry_points.txt +0 -2
- claude_mpm/dashboard/analysis_runner.py +0 -455
- claude_mpm/dashboard/index.html +0 -13
- claude_mpm/dashboard/open_dashboard.py +0 -66
- claude_mpm/dashboard/static/css/activity.css +0 -1958
- claude_mpm/dashboard/static/css/connection-status.css +0 -370
- claude_mpm/dashboard/static/css/dashboard.css +0 -4701
- claude_mpm/dashboard/static/js/components/activity-tree.js +0 -1871
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/js/components/agent-inference.js +0 -956
- claude_mpm/dashboard/static/js/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/js/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/js/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/js/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/js/components/event-processor.js +0 -542
- claude_mpm/dashboard/static/js/components/event-viewer.js +0 -1155
- claude_mpm/dashboard/static/js/components/export-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +0 -724
- claude_mpm/dashboard/static/js/components/file-viewer.js +0 -580
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +0 -211
- claude_mpm/dashboard/static/js/components/hud-manager.js +0 -671
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +0 -1718
- claude_mpm/dashboard/static/js/components/module-viewer.js +0 -2764
- claude_mpm/dashboard/static/js/components/session-manager.js +0 -579
- claude_mpm/dashboard/static/js/components/socket-manager.js +0 -368
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +0 -749
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +0 -1824
- claude_mpm/dashboard/static/js/components/working-directory.js +0 -920
- claude_mpm/dashboard/static/js/connection-manager.js +0 -536
- claude_mpm/dashboard/static/js/dashboard.js +0 -1914
- claude_mpm/dashboard/static/js/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/js/socket-client.js +0 -1474
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/socket.io.min.js +0 -7
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +0 -7
- claude_mpm/dashboard/templates/code_simple.html +0 -153
- claude_mpm/dashboard/templates/index.html +0 -606
- claude_mpm/dashboard/test_dashboard.html +0 -372
- claude_mpm/scripts/mcp_server.py +0 -75
- claude_mpm/scripts/mcp_wrapper.py +0 -39
- claude_mpm/services/mcp_gateway/__init__.py +0 -159
- claude_mpm/services/mcp_gateway/auto_configure.py +0 -369
- claude_mpm/services/mcp_gateway/config/__init__.py +0 -17
- claude_mpm/services/mcp_gateway/config/config_loader.py +0 -296
- claude_mpm/services/mcp_gateway/config/config_schema.py +0 -243
- claude_mpm/services/mcp_gateway/config/configuration.py +0 -429
- claude_mpm/services/mcp_gateway/core/__init__.py +0 -43
- claude_mpm/services/mcp_gateway/core/base.py +0 -312
- claude_mpm/services/mcp_gateway/core/exceptions.py +0 -253
- claude_mpm/services/mcp_gateway/core/interfaces.py +0 -443
- claude_mpm/services/mcp_gateway/core/process_pool.py +0 -971
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +0 -315
- claude_mpm/services/mcp_gateway/core/startup_verification.py +0 -316
- claude_mpm/services/mcp_gateway/main.py +0 -589
- claude_mpm/services/mcp_gateway/registry/__init__.py +0 -12
- claude_mpm/services/mcp_gateway/registry/service_registry.py +0 -412
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +0 -489
- claude_mpm/services/mcp_gateway/server/__init__.py +0 -15
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +0 -414
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +0 -372
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -712
- claude_mpm/services/mcp_gateway/tools/__init__.py +0 -36
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +0 -485
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +0 -789
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +0 -654
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +0 -456
- claude_mpm/services/mcp_gateway/tools/hello_world.py +0 -551
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +0 -555
- claude_mpm/services/mcp_gateway/utils/__init__.py +0 -14
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +0 -160
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +0 -170
- /claude_mpm/agents/{OUTPUT_STYLE.md → CLAUDE_MPM_OUTPUT_STYLE.md} +0 -0
- {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/WHEEL +0 -0
- {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-5.0.2.dist-info → claude_mpm-5.4.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
"""Skill preset configurations for common development scenarios.
|
|
2
|
+
|
|
3
|
+
This module defines preset bundles of skills for typical development workflows.
|
|
4
|
+
Presets enable users to deploy entire skill stacks with a single command like:
|
|
5
|
+
claude-mpm skills deploy --preset python-min
|
|
6
|
+
claude-mpm skills deploy --preset python-max
|
|
7
|
+
|
|
8
|
+
Design Decision: Presets use skill IDs from skill manifest format.
|
|
9
|
+
|
|
10
|
+
Architecture:
|
|
11
|
+
- MIN presets: Essential skills only (faster startup, lower resource usage)
|
|
12
|
+
- MAX presets: Full skill toolkit with specialized capabilities (comprehensive coverage)
|
|
13
|
+
- All presets include: skill-creator for extending capabilities
|
|
14
|
+
|
|
15
|
+
Trade-offs:
|
|
16
|
+
- Simplicity: Static lists are easy to maintain
|
|
17
|
+
- Flexibility: Dynamic functions allow auto-detection (future enhancement)
|
|
18
|
+
- Discoverability: Presets shown in CLI help and error messages
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from typing import Any, Callable, Dict, List, Union
|
|
22
|
+
|
|
23
|
+
# Type for preset resolver (can be static list or dynamic function)
|
|
24
|
+
PresetResolver = Union[List[str], Callable[[], List[str]]]
|
|
25
|
+
|
|
26
|
+
# Core skills included in ALL presets (MIN and MAX)
|
|
27
|
+
CORE_SKILLS = [
|
|
28
|
+
"universal-main-skill-creator", # Skill creation and management
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
PRESETS: Dict[str, Dict[str, Any]] = {
|
|
32
|
+
# ========================================
|
|
33
|
+
# Universal Minimal Preset
|
|
34
|
+
# ========================================
|
|
35
|
+
"minimal": {
|
|
36
|
+
"description": "Core skills only - universal starter kit",
|
|
37
|
+
"skills": CORE_SKILLS,
|
|
38
|
+
"use_cases": ["Any project type", "Quick start", "Learning"],
|
|
39
|
+
},
|
|
40
|
+
# ========================================
|
|
41
|
+
# Python Toolchain Presets
|
|
42
|
+
# ========================================
|
|
43
|
+
"python-min": {
|
|
44
|
+
"description": "Python essentials (4 skills)",
|
|
45
|
+
"skills": CORE_SKILLS
|
|
46
|
+
+ [
|
|
47
|
+
"toolchains-python-testing-pytest",
|
|
48
|
+
"toolchains-python-async-asyncio",
|
|
49
|
+
"toolchains-python-tooling-mypy",
|
|
50
|
+
],
|
|
51
|
+
"use_cases": [
|
|
52
|
+
"Python scripts",
|
|
53
|
+
"Small Python projects",
|
|
54
|
+
"FastAPI microservices",
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
"python-max": {
|
|
58
|
+
"description": "Full Python skill stack (8+ skills)",
|
|
59
|
+
"skills": CORE_SKILLS
|
|
60
|
+
+ [
|
|
61
|
+
"toolchains-python-frameworks-flask",
|
|
62
|
+
"toolchains-python-testing-pytest",
|
|
63
|
+
"toolchains-python-async-asyncio",
|
|
64
|
+
"toolchains-python-tooling-mypy",
|
|
65
|
+
"universal-testing-testing-anti-patterns",
|
|
66
|
+
"universal-testing-condition-based-waiting",
|
|
67
|
+
"universal-debugging-verification-before-completion",
|
|
68
|
+
],
|
|
69
|
+
"use_cases": ["FastAPI production", "Django projects", "Python APIs at scale"],
|
|
70
|
+
},
|
|
71
|
+
# ========================================
|
|
72
|
+
# JavaScript/TypeScript Toolchain Presets
|
|
73
|
+
# ========================================
|
|
74
|
+
"javascript-min": {
|
|
75
|
+
"description": "Node.js essentials (3 skills)",
|
|
76
|
+
"skills": CORE_SKILLS
|
|
77
|
+
+ [
|
|
78
|
+
"toolchains-javascript-frameworks-react",
|
|
79
|
+
"toolchains-javascript-tooling-biome",
|
|
80
|
+
],
|
|
81
|
+
"use_cases": ["Express.js", "Node.js scripts", "Backend microservices"],
|
|
82
|
+
},
|
|
83
|
+
"javascript-max": {
|
|
84
|
+
"description": "Full Node.js skill stack (7+ skills)",
|
|
85
|
+
"skills": CORE_SKILLS
|
|
86
|
+
+ [
|
|
87
|
+
"toolchains-javascript-frameworks-react",
|
|
88
|
+
"toolchains-javascript-frameworks-vue",
|
|
89
|
+
"toolchains-javascript-tooling-biome",
|
|
90
|
+
"toolchains-typescript-testing-vitest",
|
|
91
|
+
"toolchains-typescript-testing-jest",
|
|
92
|
+
"universal-testing-testing-anti-patterns",
|
|
93
|
+
],
|
|
94
|
+
"use_cases": ["Express.js production", "Fastify", "Koa", "Enterprise Node.js"],
|
|
95
|
+
},
|
|
96
|
+
# ========================================
|
|
97
|
+
# React Toolchain Presets
|
|
98
|
+
# ========================================
|
|
99
|
+
"react-min": {
|
|
100
|
+
"description": "React essentials (3 skills)",
|
|
101
|
+
"skills": CORE_SKILLS
|
|
102
|
+
+ [
|
|
103
|
+
"toolchains-javascript-frameworks-react",
|
|
104
|
+
"toolchains-typescript-core",
|
|
105
|
+
],
|
|
106
|
+
"use_cases": ["React SPAs", "Component libraries", "Quick prototypes"],
|
|
107
|
+
},
|
|
108
|
+
"react-max": {
|
|
109
|
+
"description": "Full React skill stack (8+ skills)",
|
|
110
|
+
"skills": CORE_SKILLS
|
|
111
|
+
+ [
|
|
112
|
+
"toolchains-javascript-frameworks-react",
|
|
113
|
+
"toolchains-javascript-frameworks-react-state-machine",
|
|
114
|
+
"toolchains-typescript-core",
|
|
115
|
+
"toolchains-typescript-testing-vitest",
|
|
116
|
+
"toolchains-ui-components-headlessui",
|
|
117
|
+
"universal-testing-testing-anti-patterns",
|
|
118
|
+
"universal-architecture-software-patterns",
|
|
119
|
+
],
|
|
120
|
+
"use_cases": [
|
|
121
|
+
"React production apps",
|
|
122
|
+
"Component systems",
|
|
123
|
+
"Frontend at scale",
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
# ========================================
|
|
127
|
+
# Next.js Toolchain Presets
|
|
128
|
+
# ========================================
|
|
129
|
+
"nextjs-min": {
|
|
130
|
+
"description": "Next.js essentials (4 skills)",
|
|
131
|
+
"skills": CORE_SKILLS
|
|
132
|
+
+ [
|
|
133
|
+
"toolchains-nextjs-core",
|
|
134
|
+
"toolchains-javascript-frameworks-react",
|
|
135
|
+
"toolchains-typescript-core",
|
|
136
|
+
],
|
|
137
|
+
"use_cases": ["Next.js apps", "Vercel deployment", "Full-stack TypeScript"],
|
|
138
|
+
},
|
|
139
|
+
"nextjs-max": {
|
|
140
|
+
"description": "Full Next.js skill stack (10+ skills)",
|
|
141
|
+
"skills": CORE_SKILLS
|
|
142
|
+
+ [
|
|
143
|
+
"toolchains-nextjs-core",
|
|
144
|
+
"toolchains-nextjs-v16",
|
|
145
|
+
"toolchains-javascript-frameworks-react",
|
|
146
|
+
"toolchains-javascript-frameworks-react-state-machine",
|
|
147
|
+
"toolchains-typescript-core",
|
|
148
|
+
"toolchains-typescript-data-prisma",
|
|
149
|
+
"toolchains-typescript-data-drizzle",
|
|
150
|
+
"toolchains-typescript-testing-vitest",
|
|
151
|
+
"universal-architecture-software-patterns",
|
|
152
|
+
],
|
|
153
|
+
"use_cases": ["Next.js production", "Enterprise apps", "Full-stack at scale"],
|
|
154
|
+
},
|
|
155
|
+
# ========================================
|
|
156
|
+
# TypeScript/Data Toolchain Presets
|
|
157
|
+
# ========================================
|
|
158
|
+
"typescript-min": {
|
|
159
|
+
"description": "TypeScript essentials (3 skills)",
|
|
160
|
+
"skills": CORE_SKILLS
|
|
161
|
+
+ [
|
|
162
|
+
"toolchains-typescript-core",
|
|
163
|
+
"toolchains-typescript-testing-vitest",
|
|
164
|
+
],
|
|
165
|
+
"use_cases": ["Type-safe apps", "TypeScript projects", "Node.js with types"],
|
|
166
|
+
},
|
|
167
|
+
"typescript-max": {
|
|
168
|
+
"description": "Full TypeScript skill stack (8+ skills)",
|
|
169
|
+
"skills": CORE_SKILLS
|
|
170
|
+
+ [
|
|
171
|
+
"toolchains-typescript-core",
|
|
172
|
+
"toolchains-typescript-testing-vitest",
|
|
173
|
+
"toolchains-typescript-testing-jest",
|
|
174
|
+
"toolchains-typescript-data-prisma",
|
|
175
|
+
"toolchains-typescript-data-drizzle",
|
|
176
|
+
"toolchains-typescript-data-kysely",
|
|
177
|
+
"universal-architecture-software-patterns",
|
|
178
|
+
],
|
|
179
|
+
"use_cases": ["Enterprise TypeScript", "Full-stack apps", "Type-safe APIs"],
|
|
180
|
+
},
|
|
181
|
+
# ========================================
|
|
182
|
+
# Rust Toolchain Presets
|
|
183
|
+
# ========================================
|
|
184
|
+
"rust-min": {
|
|
185
|
+
"description": "Rust essentials (2 skills)",
|
|
186
|
+
"skills": CORE_SKILLS
|
|
187
|
+
+ [
|
|
188
|
+
"toolchains-rust-desktop-applications",
|
|
189
|
+
],
|
|
190
|
+
"use_cases": ["Rust CLI tools", "Systems programming", "WebAssembly"],
|
|
191
|
+
},
|
|
192
|
+
"rust-max": {
|
|
193
|
+
"description": "Full Rust skill stack (4+ skills)",
|
|
194
|
+
"skills": CORE_SKILLS
|
|
195
|
+
+ [
|
|
196
|
+
"toolchains-rust-desktop-applications",
|
|
197
|
+
"toolchains-rust-frameworks-tauri",
|
|
198
|
+
"universal-architecture-software-patterns",
|
|
199
|
+
],
|
|
200
|
+
"use_cases": [
|
|
201
|
+
"Rust production systems",
|
|
202
|
+
"Performance-critical apps",
|
|
203
|
+
"Safe systems",
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
# ========================================
|
|
207
|
+
# WordPress Toolchain Presets
|
|
208
|
+
# ========================================
|
|
209
|
+
"wordpress-min": {
|
|
210
|
+
"description": "WordPress essentials (2 skills)",
|
|
211
|
+
"skills": CORE_SKILLS
|
|
212
|
+
+ [
|
|
213
|
+
"toolchains-php-frameworks-wordpress-plugin-fundamentals",
|
|
214
|
+
],
|
|
215
|
+
"use_cases": [
|
|
216
|
+
"WordPress plugins",
|
|
217
|
+
"Theme customization",
|
|
218
|
+
"Quick WordPress dev",
|
|
219
|
+
],
|
|
220
|
+
},
|
|
221
|
+
"wordpress-max": {
|
|
222
|
+
"description": "Full WordPress skill stack (3+ skills)",
|
|
223
|
+
"skills": CORE_SKILLS
|
|
224
|
+
+ [
|
|
225
|
+
"toolchains-php-frameworks-wordpress-plugin-fundamentals",
|
|
226
|
+
"toolchains-php-frameworks-wordpress-block-editor",
|
|
227
|
+
"toolchains-php-frameworks-espocrm",
|
|
228
|
+
],
|
|
229
|
+
"use_cases": ["WordPress production", "Block themes", "Custom blocks", "FSE"],
|
|
230
|
+
},
|
|
231
|
+
# ========================================
|
|
232
|
+
# AI/MCP Toolchain Presets
|
|
233
|
+
# ========================================
|
|
234
|
+
"ai-min": {
|
|
235
|
+
"description": "AI essentials (2 skills)",
|
|
236
|
+
"skills": CORE_SKILLS
|
|
237
|
+
+ [
|
|
238
|
+
"toolchains-ai-protocols-mcp",
|
|
239
|
+
],
|
|
240
|
+
"use_cases": ["MCP servers", "Claude integrations", "AI tools"],
|
|
241
|
+
},
|
|
242
|
+
"ai-max": {
|
|
243
|
+
"description": "Full AI skill stack (3+ skills)",
|
|
244
|
+
"skills": CORE_SKILLS
|
|
245
|
+
+ [
|
|
246
|
+
"toolchains-ai-protocols-mcp",
|
|
247
|
+
"toolchains-ai-services-openrouter",
|
|
248
|
+
"universal-main-artifacts-builder",
|
|
249
|
+
],
|
|
250
|
+
"use_cases": ["Multi-model AI apps", "Claude Desktop extensions", "AI tooling"],
|
|
251
|
+
},
|
|
252
|
+
# ========================================
|
|
253
|
+
# Svelte Toolchain Presets
|
|
254
|
+
# ========================================
|
|
255
|
+
"svelte-min": {
|
|
256
|
+
"description": "Svelte essentials (2 skills)",
|
|
257
|
+
"skills": CORE_SKILLS
|
|
258
|
+
+ [
|
|
259
|
+
"toolchains-javascript-frameworks-svelte",
|
|
260
|
+
],
|
|
261
|
+
"use_cases": ["Svelte apps", "Reactive UIs", "Minimal JavaScript"],
|
|
262
|
+
},
|
|
263
|
+
"svelte-max": {
|
|
264
|
+
"description": "Full Svelte skill stack (3+ skills)",
|
|
265
|
+
"skills": CORE_SKILLS
|
|
266
|
+
+ [
|
|
267
|
+
"toolchains-javascript-frameworks-svelte",
|
|
268
|
+
"toolchains-javascript-frameworks-sveltekit",
|
|
269
|
+
"toolchains-typescript-core",
|
|
270
|
+
],
|
|
271
|
+
"use_cases": ["SvelteKit production", "Full-stack Svelte", "SSR/SSG apps"],
|
|
272
|
+
},
|
|
273
|
+
# ========================================
|
|
274
|
+
# Universal/Testing Toolchain Presets
|
|
275
|
+
# ========================================
|
|
276
|
+
"testing-min": {
|
|
277
|
+
"description": "Testing essentials (3 skills)",
|
|
278
|
+
"skills": CORE_SKILLS
|
|
279
|
+
+ [
|
|
280
|
+
"universal-testing-testing-anti-patterns",
|
|
281
|
+
"universal-testing-condition-based-waiting",
|
|
282
|
+
],
|
|
283
|
+
"use_cases": ["Test quality", "Async testing", "Test improvement"],
|
|
284
|
+
},
|
|
285
|
+
"testing-max": {
|
|
286
|
+
"description": "Full testing skill stack (6+ skills)",
|
|
287
|
+
"skills": CORE_SKILLS
|
|
288
|
+
+ [
|
|
289
|
+
"universal-testing-testing-anti-patterns",
|
|
290
|
+
"universal-testing-condition-based-waiting",
|
|
291
|
+
"universal-debugging-verification-before-completion",
|
|
292
|
+
"toolchains-typescript-testing-vitest",
|
|
293
|
+
"toolchains-typescript-testing-jest",
|
|
294
|
+
"toolchains-python-testing-pytest",
|
|
295
|
+
],
|
|
296
|
+
"use_cases": ["Comprehensive testing", "Test automation", "Quality assurance"],
|
|
297
|
+
},
|
|
298
|
+
# ========================================
|
|
299
|
+
# Collaboration Toolchain Presets
|
|
300
|
+
# ========================================
|
|
301
|
+
"collaboration-min": {
|
|
302
|
+
"description": "Collaboration essentials (2 skills)",
|
|
303
|
+
"skills": CORE_SKILLS
|
|
304
|
+
+ [
|
|
305
|
+
"universal-collaboration-brainstorming",
|
|
306
|
+
],
|
|
307
|
+
"use_cases": ["Idea refinement", "Design thinking", "Feature planning"],
|
|
308
|
+
},
|
|
309
|
+
"collaboration-max": {
|
|
310
|
+
"description": "Full collaboration skill stack (4+ skills)",
|
|
311
|
+
"skills": CORE_SKILLS
|
|
312
|
+
+ [
|
|
313
|
+
"universal-collaboration-brainstorming",
|
|
314
|
+
"universal-collaboration-writing-plans",
|
|
315
|
+
"universal-collaboration-requesting-code-review",
|
|
316
|
+
"universal-collaboration-dispatching-parallel-agents",
|
|
317
|
+
],
|
|
318
|
+
"use_cases": ["Team coordination", "Code reviews", "Planning", "Parallel work"],
|
|
319
|
+
},
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def get_preset_names() -> List[str]:
|
|
324
|
+
"""Get list of all available preset names.
|
|
325
|
+
|
|
326
|
+
Returns:
|
|
327
|
+
List of preset names (e.g., ['minimal', 'python-min', 'python-max', ...])
|
|
328
|
+
|
|
329
|
+
Example:
|
|
330
|
+
>>> names = get_preset_names()
|
|
331
|
+
>>> 'python-min' in names
|
|
332
|
+
True
|
|
333
|
+
"""
|
|
334
|
+
return list(PRESETS.keys())
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
def get_preset_info(preset_name: str) -> Dict[str, Any]:
|
|
338
|
+
"""Get preset metadata (description, use cases, skill count).
|
|
339
|
+
|
|
340
|
+
Args:
|
|
341
|
+
preset_name: Name of preset (e.g., 'python-min')
|
|
342
|
+
|
|
343
|
+
Returns:
|
|
344
|
+
Dict with keys:
|
|
345
|
+
- name: Preset name
|
|
346
|
+
- description: Human-readable description
|
|
347
|
+
- skill_count: Number of skills in preset
|
|
348
|
+
- use_cases: List of use case strings
|
|
349
|
+
|
|
350
|
+
Raises:
|
|
351
|
+
ValueError: If preset name is invalid
|
|
352
|
+
|
|
353
|
+
Example:
|
|
354
|
+
>>> info = get_preset_info('python-min')
|
|
355
|
+
>>> info['skill_count']
|
|
356
|
+
4
|
|
357
|
+
"""
|
|
358
|
+
if preset_name not in PRESETS:
|
|
359
|
+
raise ValueError(f"Unknown preset: {preset_name}")
|
|
360
|
+
|
|
361
|
+
preset = PRESETS[preset_name]
|
|
362
|
+
return {
|
|
363
|
+
"name": preset_name,
|
|
364
|
+
"description": preset["description"],
|
|
365
|
+
"skill_count": len(preset["skills"]),
|
|
366
|
+
"use_cases": preset["use_cases"],
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def get_preset_skills(preset_name: str) -> List[str]:
|
|
371
|
+
"""Get skill list for preset.
|
|
372
|
+
|
|
373
|
+
Args:
|
|
374
|
+
preset_name: Name of preset (e.g., 'python-min')
|
|
375
|
+
|
|
376
|
+
Returns:
|
|
377
|
+
List of skill IDs (e.g., ["universal-main-skill-creator", ...])
|
|
378
|
+
|
|
379
|
+
Raises:
|
|
380
|
+
ValueError: If preset name is invalid
|
|
381
|
+
|
|
382
|
+
Example:
|
|
383
|
+
>>> skills = get_preset_skills('python-min')
|
|
384
|
+
>>> len(skills)
|
|
385
|
+
4
|
|
386
|
+
>>> 'universal-main-skill-creator' in skills
|
|
387
|
+
True
|
|
388
|
+
"""
|
|
389
|
+
if preset_name not in PRESETS:
|
|
390
|
+
raise ValueError(f"Unknown preset: {preset_name}")
|
|
391
|
+
|
|
392
|
+
return PRESETS[preset_name]["skills"]
|
claude_mpm/constants.py
CHANGED
|
@@ -168,6 +168,7 @@ class SkillsCommands(str, Enum):
|
|
|
168
168
|
UPDATE = "update"
|
|
169
169
|
INFO = "info"
|
|
170
170
|
CONFIG = "config"
|
|
171
|
+
CONFIGURE = "configure" # Interactive skills selection (like agents configure)
|
|
171
172
|
# GitHub deployment commands
|
|
172
173
|
DEPLOY_FROM_GITHUB = "deploy-github"
|
|
173
174
|
LIST_AVAILABLE = "list-available"
|
claude_mpm/core/claude_runner.py
CHANGED
|
@@ -802,31 +802,8 @@ Use these agents to delegate specialized work via the Task tool.
|
|
|
802
802
|
raise RuntimeError("Subprocess launcher service not available")
|
|
803
803
|
|
|
804
804
|
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
return """You are Claude Code running in Claude MPM (Multi-Agent Project Manager).
|
|
808
|
-
|
|
809
|
-
You have access to native subagents via the Task tool with subagent_type parameter:
|
|
810
|
-
- engineer: For coding, implementation, and technical tasks
|
|
811
|
-
- qa: For testing, validation, and quality assurance
|
|
812
|
-
- documentation: For docs, guides, and explanations
|
|
813
|
-
- research: For investigation and analysis
|
|
814
|
-
- security: For security-related tasks
|
|
815
|
-
- ops: For deployment and infrastructure
|
|
816
|
-
- version-control: For git and version management
|
|
817
|
-
- data-engineer: For data processing and APIs
|
|
818
|
-
|
|
819
|
-
Use these agents by calling: Task(description="task description", subagent_type="agent_name")
|
|
820
|
-
|
|
821
|
-
IMPORTANT: The Task tool accepts both naming formats:
|
|
822
|
-
- Capitalized format: "Research", "Engineer", "QA", "Version Control", "Data Engineer"
|
|
823
|
-
- Lowercase format: "research", "engineer", "qa", "version-control", "data-engineer"
|
|
824
|
-
|
|
825
|
-
Both formats work correctly. When you see capitalized names (matching TodoWrite prefixes),
|
|
826
|
-
automatically normalize them to lowercase-hyphenated format for the Task tool.
|
|
827
|
-
|
|
828
|
-
Work efficiently and delegate appropriately to subagents when needed."""
|
|
829
|
-
|
|
805
|
+
# Moved to claude_mpm.core.system_context to avoid circular imports
|
|
806
|
+
from claude_mpm.core.system_context import create_simple_context
|
|
830
807
|
|
|
831
808
|
# Backward compatibility alias
|
|
832
809
|
SimpleClaudeRunner = ClaudeRunner
|
|
@@ -115,7 +115,11 @@ class AgentLoader:
|
|
|
115
115
|
return agents
|
|
116
116
|
|
|
117
117
|
def discover_local_json_templates(self) -> Dict[str, Dict[str, Any]]:
|
|
118
|
-
"""Discover local JSON agent templates
|
|
118
|
+
"""Discover local JSON agent templates.
|
|
119
|
+
|
|
120
|
+
NOTE: This method is kept for backward compatibility but is deprecated.
|
|
121
|
+
The new architecture uses SOURCE (~/.claude-mpm/cache/remote-agents/)
|
|
122
|
+
and DEPLOYMENT (.claude/agents/) locations only.
|
|
119
123
|
|
|
120
124
|
Returns:
|
|
121
125
|
Dictionary mapping agent IDs to agent metadata
|
|
@@ -125,11 +129,10 @@ class AgentLoader:
|
|
|
125
129
|
local_agents = {}
|
|
126
130
|
|
|
127
131
|
# Check for local JSON templates in priority order
|
|
132
|
+
# NOTE: These directories are deprecated in the simplified architecture
|
|
128
133
|
template_dirs = [
|
|
129
|
-
Path.cwd()
|
|
130
|
-
/ ".claude-mpm"
|
|
131
|
-
/ "agents", # Project local agents (highest priority)
|
|
132
|
-
Path.home() / ".claude-mpm" / "agents", # User local agents
|
|
134
|
+
Path.cwd() / ".claude-mpm" / "agents", # Deprecated: Project local agents
|
|
135
|
+
Path.home() / ".claude-mpm" / "agents", # Deprecated: User local agents
|
|
133
136
|
]
|
|
134
137
|
|
|
135
138
|
for priority, template_dir in enumerate(template_dirs):
|
|
@@ -66,6 +66,53 @@ class FileLoader:
|
|
|
66
66
|
if "INSTRUCTIONS.md" in str(file_path):
|
|
67
67
|
self.framework_last_modified = timestamp
|
|
68
68
|
|
|
69
|
+
def _load_tier_file(
|
|
70
|
+
self,
|
|
71
|
+
filename: str,
|
|
72
|
+
current_dir: Path,
|
|
73
|
+
framework_path: Optional[Path] = None,
|
|
74
|
+
include_system: bool = False,
|
|
75
|
+
) -> tuple[Optional[str], Optional[str]]:
|
|
76
|
+
"""Load file with tier precedence: project → user → system.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
filename: Name of file to load (e.g., "INSTRUCTIONS.md")
|
|
80
|
+
current_dir: Current working directory for project-level
|
|
81
|
+
framework_path: Path to framework installation for system-level
|
|
82
|
+
include_system: Whether to check system-level path
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
Tuple of (content, level) where level is 'project', 'user', 'system', or None
|
|
86
|
+
"""
|
|
87
|
+
# Check project-level (highest priority)
|
|
88
|
+
project_path = current_dir / ".claude-mpm" / filename
|
|
89
|
+
if project_path.exists():
|
|
90
|
+
loaded_content = self.try_load_file(
|
|
91
|
+
project_path, f"project-specific {filename}"
|
|
92
|
+
)
|
|
93
|
+
if loaded_content:
|
|
94
|
+
self.logger.info(f"Using project-specific {filename} from .claude-mpm/")
|
|
95
|
+
return loaded_content, "project"
|
|
96
|
+
|
|
97
|
+
# Check user-level (medium priority)
|
|
98
|
+
user_path = Path.home() / ".claude-mpm" / filename
|
|
99
|
+
if user_path.exists():
|
|
100
|
+
loaded_content = self.try_load_file(user_path, f"user-specific {filename}")
|
|
101
|
+
if loaded_content:
|
|
102
|
+
self.logger.info(f"Using user-specific {filename} from ~/.claude-mpm/")
|
|
103
|
+
return loaded_content, "user"
|
|
104
|
+
|
|
105
|
+
# Check system-level (lowest priority)
|
|
106
|
+
if include_system and framework_path and framework_path != Path("__PACKAGED__"):
|
|
107
|
+
system_path = framework_path / "src" / "claude_mpm" / "agents" / filename
|
|
108
|
+
if system_path.exists():
|
|
109
|
+
loaded_content = self.try_load_file(system_path, f"system {filename}")
|
|
110
|
+
if loaded_content:
|
|
111
|
+
self.logger.info(f"Using system {filename}")
|
|
112
|
+
return loaded_content, "system"
|
|
113
|
+
|
|
114
|
+
return None, None
|
|
115
|
+
|
|
69
116
|
def load_instructions_file(
|
|
70
117
|
self, current_dir: Path
|
|
71
118
|
) -> tuple[Optional[str], Optional[str]]:
|
|
@@ -82,31 +129,7 @@ class FileLoader:
|
|
|
82
129
|
Returns:
|
|
83
130
|
Tuple of (content, level) where level is 'project', 'user', or None
|
|
84
131
|
"""
|
|
85
|
-
|
|
86
|
-
project_instructions_path = current_dir / ".claude-mpm" / "INSTRUCTIONS.md"
|
|
87
|
-
if project_instructions_path.exists():
|
|
88
|
-
loaded_content = self.try_load_file(
|
|
89
|
-
project_instructions_path, "project-specific INSTRUCTIONS.md"
|
|
90
|
-
)
|
|
91
|
-
if loaded_content:
|
|
92
|
-
self.logger.info(
|
|
93
|
-
"Using project-specific PM instructions from .claude-mpm/INSTRUCTIONS.md"
|
|
94
|
-
)
|
|
95
|
-
return loaded_content, "project"
|
|
96
|
-
|
|
97
|
-
# Check for user-specific INSTRUCTIONS.md
|
|
98
|
-
user_instructions_path = Path.home() / ".claude-mpm" / "INSTRUCTIONS.md"
|
|
99
|
-
if user_instructions_path.exists():
|
|
100
|
-
loaded_content = self.try_load_file(
|
|
101
|
-
user_instructions_path, "user-specific INSTRUCTIONS.md"
|
|
102
|
-
)
|
|
103
|
-
if loaded_content:
|
|
104
|
-
self.logger.info(
|
|
105
|
-
"Using user-specific PM instructions from ~/.claude-mpm/INSTRUCTIONS.md"
|
|
106
|
-
)
|
|
107
|
-
return loaded_content, "user"
|
|
108
|
-
|
|
109
|
-
return None, None
|
|
132
|
+
return self._load_tier_file("INSTRUCTIONS.md", current_dir)
|
|
110
133
|
|
|
111
134
|
def load_workflow_file(
|
|
112
135
|
self, current_dir: Path, framework_path: Path
|
|
@@ -126,44 +149,9 @@ class FileLoader:
|
|
|
126
149
|
Returns:
|
|
127
150
|
Tuple of (content, level) where level is 'project', 'user', 'system', or None
|
|
128
151
|
"""
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
loaded_content = self.try_load_file(
|
|
133
|
-
project_workflow_path, "project-specific WORKFLOW.md"
|
|
134
|
-
)
|
|
135
|
-
if loaded_content:
|
|
136
|
-
self.logger.info(
|
|
137
|
-
"Using project-specific workflow instructions from .claude-mpm/WORKFLOW.md"
|
|
138
|
-
)
|
|
139
|
-
return loaded_content, "project"
|
|
140
|
-
|
|
141
|
-
# Check for user-specific WORKFLOW.md (medium priority)
|
|
142
|
-
user_workflow_path = Path.home() / ".claude-mpm" / "WORKFLOW.md"
|
|
143
|
-
if user_workflow_path.exists():
|
|
144
|
-
loaded_content = self.try_load_file(
|
|
145
|
-
user_workflow_path, "user-specific WORKFLOW.md"
|
|
146
|
-
)
|
|
147
|
-
if loaded_content:
|
|
148
|
-
self.logger.info(
|
|
149
|
-
"Using user-specific workflow instructions from ~/.claude-mpm/WORKFLOW.md"
|
|
150
|
-
)
|
|
151
|
-
return loaded_content, "user"
|
|
152
|
-
|
|
153
|
-
# Fall back to system workflow (lowest priority)
|
|
154
|
-
if framework_path and framework_path != Path("__PACKAGED__"):
|
|
155
|
-
system_workflow_path = (
|
|
156
|
-
framework_path / "src" / "claude_mpm" / "agents" / "WORKFLOW.md"
|
|
157
|
-
)
|
|
158
|
-
if system_workflow_path.exists():
|
|
159
|
-
loaded_content = self.try_load_file(
|
|
160
|
-
system_workflow_path, "system WORKFLOW.md"
|
|
161
|
-
)
|
|
162
|
-
if loaded_content:
|
|
163
|
-
self.logger.info("Using system workflow instructions")
|
|
164
|
-
return loaded_content, "system"
|
|
165
|
-
|
|
166
|
-
return None, None
|
|
152
|
+
return self._load_tier_file(
|
|
153
|
+
"WORKFLOW.md", current_dir, framework_path, include_system=True
|
|
154
|
+
)
|
|
167
155
|
|
|
168
156
|
def load_memory_file(
|
|
169
157
|
self, current_dir: Path, framework_path: Path
|
|
@@ -183,41 +171,6 @@ class FileLoader:
|
|
|
183
171
|
Returns:
|
|
184
172
|
Tuple of (content, level) where level is 'project', 'user', 'system', or None
|
|
185
173
|
"""
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
loaded_content = self.try_load_file(
|
|
190
|
-
project_memory_path, "project-specific MEMORY.md"
|
|
191
|
-
)
|
|
192
|
-
if loaded_content:
|
|
193
|
-
self.logger.info(
|
|
194
|
-
"Using project-specific memory instructions from .claude-mpm/MEMORY.md"
|
|
195
|
-
)
|
|
196
|
-
return loaded_content, "project"
|
|
197
|
-
|
|
198
|
-
# Check for user-specific MEMORY.md (medium priority)
|
|
199
|
-
user_memory_path = Path.home() / ".claude-mpm" / "MEMORY.md"
|
|
200
|
-
if user_memory_path.exists():
|
|
201
|
-
loaded_content = self.try_load_file(
|
|
202
|
-
user_memory_path, "user-specific MEMORY.md"
|
|
203
|
-
)
|
|
204
|
-
if loaded_content:
|
|
205
|
-
self.logger.info(
|
|
206
|
-
"Using user-specific memory instructions from ~/.claude-mpm/MEMORY.md"
|
|
207
|
-
)
|
|
208
|
-
return loaded_content, "user"
|
|
209
|
-
|
|
210
|
-
# Fall back to system memory instructions (lowest priority)
|
|
211
|
-
if framework_path and framework_path != Path("__PACKAGED__"):
|
|
212
|
-
system_memory_path = (
|
|
213
|
-
framework_path / "src" / "claude_mpm" / "agents" / "MEMORY.md"
|
|
214
|
-
)
|
|
215
|
-
if system_memory_path.exists():
|
|
216
|
-
loaded_content = self.try_load_file(
|
|
217
|
-
system_memory_path, "system MEMORY.md"
|
|
218
|
-
)
|
|
219
|
-
if loaded_content:
|
|
220
|
-
self.logger.info("Using system memory instructions")
|
|
221
|
-
return loaded_content, "system"
|
|
222
|
-
|
|
223
|
-
return None, None
|
|
174
|
+
return self._load_tier_file(
|
|
175
|
+
"MEMORY.md", current_dir, framework_path, include_system=True
|
|
176
|
+
)
|