claude-mpm 4.16.2__py3-none-any.whl → 4.17.0__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/commands/mpm-help.md +3 -0
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +1 -0
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/skills/registry.py +97 -9
- {claude_mpm-4.16.2.dist-info → claude_mpm-4.17.0.dist-info}/METADATA +16 -6
- {claude_mpm-4.16.2.dist-info → claude_mpm-4.17.0.dist-info}/RECORD +12 -11
- {claude_mpm-4.16.2.dist-info → claude_mpm-4.17.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.16.2.dist-info → claude_mpm-4.17.0.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.16.2.dist-info → claude_mpm-4.17.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.16.2.dist-info → claude_mpm-4.17.0.dist-info}/top_level.txt +0 -0
claude_mpm/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
4.
|
|
1
|
+
4.17.0
|
claude_mpm/commands/mpm-help.md
CHANGED
|
@@ -90,6 +90,9 @@ Available Commands:
|
|
|
90
90
|
/mpm-monitor [start|stop|restart|status|port]
|
|
91
91
|
Manage Socket.IO monitoring server and dashboard
|
|
92
92
|
|
|
93
|
+
/mpm-version
|
|
94
|
+
Display comprehensive version information including project version, all agents with versions, and all skills with versions
|
|
95
|
+
|
|
93
96
|
Use '/mpm-help <command>' for detailed help on a specific command.
|
|
94
97
|
```
|
|
95
98
|
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Display Claude MPM Version Information
|
|
2
|
+
|
|
3
|
+
Show comprehensive version information for Claude MPM project, agents, and skills.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/mpm-version
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Description
|
|
12
|
+
|
|
13
|
+
Display version information including:
|
|
14
|
+
- Project version and build number
|
|
15
|
+
- All deployed agents with their versions (grouped by tier: system/user/project)
|
|
16
|
+
- All available skills with their versions (grouped by source: bundled/user/project)
|
|
17
|
+
- Summary statistics
|
|
18
|
+
|
|
19
|
+
## Implementation
|
|
20
|
+
|
|
21
|
+
When you run `/mpm-version`, the PM will:
|
|
22
|
+
|
|
23
|
+
1. **Collect Version Information**
|
|
24
|
+
- Use VersionService to gather all version data
|
|
25
|
+
- Project version from pyproject.toml
|
|
26
|
+
- Build number from BUILD_NUMBER file
|
|
27
|
+
- Agent versions from AgentRegistry
|
|
28
|
+
- Skills versions from SkillRegistry
|
|
29
|
+
|
|
30
|
+
2. **Format Output**
|
|
31
|
+
- Hierarchical display: Project → Agents → Skills
|
|
32
|
+
- Grouped by tier/source for clarity
|
|
33
|
+
- Sorted alphabetically within groups
|
|
34
|
+
- Summary statistics at the end
|
|
35
|
+
|
|
36
|
+
3. **Display Results**
|
|
37
|
+
- Well-formatted tree structure
|
|
38
|
+
- Easy to scan and read
|
|
39
|
+
- Includes totals and counts
|
|
40
|
+
|
|
41
|
+
## Example Output
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
Claude MPM Version Information
|
|
45
|
+
==============================
|
|
46
|
+
|
|
47
|
+
Project Version: 4.16.3
|
|
48
|
+
Build: 481
|
|
49
|
+
|
|
50
|
+
Agents (35 total)
|
|
51
|
+
-----------------
|
|
52
|
+
|
|
53
|
+
System Agents (30):
|
|
54
|
+
├─ agent-manager (1.0.0)
|
|
55
|
+
├─ engineer (3.9.1)
|
|
56
|
+
├─ research-agent (4.5.1)
|
|
57
|
+
├─ documentation (2.1.0)
|
|
58
|
+
├─ qa (2.0.3)
|
|
59
|
+
└─ ... (25 more)
|
|
60
|
+
|
|
61
|
+
User Agents (3):
|
|
62
|
+
├─ custom-agent (1.0.0)
|
|
63
|
+
├─ testing-agent (0.5.0)
|
|
64
|
+
└─ prototype-agent (0.1.0)
|
|
65
|
+
|
|
66
|
+
Project Agents (2):
|
|
67
|
+
├─ project-specific (2.0.0)
|
|
68
|
+
└─ domain-expert (1.1.0)
|
|
69
|
+
|
|
70
|
+
Skills (20 total)
|
|
71
|
+
-----------------
|
|
72
|
+
|
|
73
|
+
Bundled Skills (20):
|
|
74
|
+
├─ test-driven-development (0.1.0)
|
|
75
|
+
├─ systematic-debugging (0.1.0)
|
|
76
|
+
├─ async-testing (0.1.0)
|
|
77
|
+
├─ performance-profiling (0.1.0)
|
|
78
|
+
├─ security-scanning (0.1.0)
|
|
79
|
+
└─ ... (15 more)
|
|
80
|
+
|
|
81
|
+
User Skills (0):
|
|
82
|
+
(none)
|
|
83
|
+
|
|
84
|
+
Project Skills (0):
|
|
85
|
+
(none)
|
|
86
|
+
|
|
87
|
+
Summary
|
|
88
|
+
-------
|
|
89
|
+
• Project: v4.16.3 (build 481)
|
|
90
|
+
• Agents: 35 total (30 system, 3 user, 2 project)
|
|
91
|
+
• Skills: 20 total (20 bundled, 0 user, 0 project)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## PM Implementation Instructions
|
|
95
|
+
|
|
96
|
+
To execute this command, PM should:
|
|
97
|
+
|
|
98
|
+
1. Import and use VersionService:
|
|
99
|
+
```python
|
|
100
|
+
from claude_mpm.services.version_service import VersionService
|
|
101
|
+
|
|
102
|
+
service = VersionService()
|
|
103
|
+
summary = service.get_version_summary()
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
2. Format output following the example structure above
|
|
107
|
+
3. Handle missing data gracefully (show "unknown" for missing versions)
|
|
108
|
+
4. Include all tiers/sources even if counts are zero
|
|
109
|
+
|
|
110
|
+
## Related Commands
|
|
111
|
+
|
|
112
|
+
- `/mpm-help` - Show all available MPM commands
|
|
113
|
+
- `/mpm-status` - Show system status information
|
claude_mpm/commands/mpm.md
CHANGED
|
@@ -8,6 +8,7 @@ Available MPM commands:
|
|
|
8
8
|
- /mpm-help - Show command help
|
|
9
9
|
- /mpm-status - Show MPM status
|
|
10
10
|
- /mpm-config - Manage configuration
|
|
11
|
+
- /mpm-version - Display version information for project, agents, and skills
|
|
11
12
|
|
|
12
13
|
Claude MPM extends Claude Code with:
|
|
13
14
|
- Multi-agent orchestration
|
|
@@ -9,7 +9,7 @@ Extracted from ClaudeRunner to follow Single Responsibility Principle.
|
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
from pathlib import Path
|
|
12
|
-
from typing import Any, Dict, Optional
|
|
12
|
+
from typing import Any, Dict, List, Optional
|
|
13
13
|
|
|
14
14
|
from claude_mpm.config.paths import paths
|
|
15
15
|
from claude_mpm.core.base_service import BaseService
|
|
@@ -274,3 +274,106 @@ class VersionService(BaseService, VersionServiceInterface):
|
|
|
274
274
|
"message": "Update checking not implemented",
|
|
275
275
|
"checked_at": None,
|
|
276
276
|
}
|
|
277
|
+
|
|
278
|
+
def get_agents_versions(self) -> Dict[str, List[Dict[str, str]]]:
|
|
279
|
+
"""Get all agents grouped by tier with versions.
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
Dict with keys: system, user, project
|
|
283
|
+
Each value is list of agent dicts with: name, version, id
|
|
284
|
+
"""
|
|
285
|
+
from claude_mpm.core.unified_agent_registry import get_agent_registry
|
|
286
|
+
|
|
287
|
+
agents_by_tier = {"system": [], "user": [], "project": []}
|
|
288
|
+
|
|
289
|
+
try:
|
|
290
|
+
registry = get_agent_registry()
|
|
291
|
+
all_agents = registry.list_agents()
|
|
292
|
+
|
|
293
|
+
for agent in all_agents:
|
|
294
|
+
agent_info = {
|
|
295
|
+
"name": agent.name,
|
|
296
|
+
"version": agent.version,
|
|
297
|
+
"id": agent.name, # Use name as ID since agent_id doesn't exist
|
|
298
|
+
}
|
|
299
|
+
tier = (
|
|
300
|
+
agent.tier.value
|
|
301
|
+
if hasattr(agent.tier, "value")
|
|
302
|
+
else str(agent.tier)
|
|
303
|
+
)
|
|
304
|
+
if tier in agents_by_tier:
|
|
305
|
+
agents_by_tier[tier].append(agent_info)
|
|
306
|
+
else:
|
|
307
|
+
agents_by_tier["system"].append(agent_info)
|
|
308
|
+
|
|
309
|
+
# Sort each tier alphabetically by name
|
|
310
|
+
for tier, agents in agents_by_tier.items():
|
|
311
|
+
agents.sort(key=lambda x: x["name"])
|
|
312
|
+
|
|
313
|
+
except Exception as e:
|
|
314
|
+
self.logger.error(f"Failed to get agent versions: {e}")
|
|
315
|
+
|
|
316
|
+
return agents_by_tier
|
|
317
|
+
|
|
318
|
+
def get_skills_versions(self) -> Dict[str, List[Dict[str, str]]]:
|
|
319
|
+
"""Get all skills grouped by source with versions.
|
|
320
|
+
|
|
321
|
+
Returns:
|
|
322
|
+
Dict with keys: bundled, user, project
|
|
323
|
+
Each value is list of skill dicts with: name, version, description
|
|
324
|
+
"""
|
|
325
|
+
from claude_mpm.skills.registry import get_registry
|
|
326
|
+
|
|
327
|
+
skills_by_source = {"bundled": [], "user": [], "project": []}
|
|
328
|
+
|
|
329
|
+
try:
|
|
330
|
+
registry = get_registry()
|
|
331
|
+
|
|
332
|
+
for skill in registry.list_skills():
|
|
333
|
+
skill_info = {
|
|
334
|
+
"name": skill.name,
|
|
335
|
+
"version": skill.version,
|
|
336
|
+
"description": (
|
|
337
|
+
skill.description[:60] + "..."
|
|
338
|
+
if len(skill.description) > 60
|
|
339
|
+
else skill.description
|
|
340
|
+
),
|
|
341
|
+
}
|
|
342
|
+
source = skill.source if skill.source in skills_by_source else "bundled"
|
|
343
|
+
skills_by_source[source].append(skill_info)
|
|
344
|
+
|
|
345
|
+
# Sort each source alphabetically by name
|
|
346
|
+
for source, skills in skills_by_source.items():
|
|
347
|
+
skills.sort(key=lambda x: x["name"])
|
|
348
|
+
|
|
349
|
+
except Exception as e:
|
|
350
|
+
self.logger.error(f"Failed to get skill versions: {e}")
|
|
351
|
+
|
|
352
|
+
return skills_by_source
|
|
353
|
+
|
|
354
|
+
def get_version_summary(self) -> Dict:
|
|
355
|
+
"""Get complete version summary.
|
|
356
|
+
|
|
357
|
+
Returns:
|
|
358
|
+
Dict with project_version, build, agents, skills, and counts
|
|
359
|
+
"""
|
|
360
|
+
agents = self.get_agents_versions()
|
|
361
|
+
skills = self.get_skills_versions()
|
|
362
|
+
build = self.get_build_number()
|
|
363
|
+
|
|
364
|
+
return {
|
|
365
|
+
"project_version": self.get_base_version(),
|
|
366
|
+
"build": build,
|
|
367
|
+
"agents": agents,
|
|
368
|
+
"skills": skills,
|
|
369
|
+
"counts": {
|
|
370
|
+
"agents_total": sum(len(v) for v in agents.values()),
|
|
371
|
+
"agents_system": len(agents.get("system", [])),
|
|
372
|
+
"agents_user": len(agents.get("user", [])),
|
|
373
|
+
"agents_project": len(agents.get("project", [])),
|
|
374
|
+
"skills_total": sum(len(v) for v in skills.values()),
|
|
375
|
+
"skills_bundled": len(skills.get("bundled", [])),
|
|
376
|
+
"skills_user": len(skills.get("user", [])),
|
|
377
|
+
"skills_project": len(skills.get("project", [])),
|
|
378
|
+
},
|
|
379
|
+
}
|
claude_mpm/skills/registry.py
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
"""Skills registry - manages bundled and discovered skills."""
|
|
2
2
|
|
|
3
|
+
import re
|
|
3
4
|
from dataclasses import dataclass
|
|
4
5
|
from pathlib import Path
|
|
5
|
-
from typing import Dict, List, Optional
|
|
6
|
+
from typing import Any, Dict, List, Optional
|
|
7
|
+
|
|
8
|
+
import yaml
|
|
6
9
|
|
|
7
10
|
from claude_mpm.core.logging_utils import get_logger
|
|
8
11
|
|
|
@@ -17,13 +20,27 @@ class Skill:
|
|
|
17
20
|
path: Path
|
|
18
21
|
content: str
|
|
19
22
|
source: str # 'bundled', 'user', or 'project'
|
|
23
|
+
|
|
24
|
+
# Version tracking fields
|
|
25
|
+
version: str = "0.1.0"
|
|
26
|
+
skill_id: str = "" # defaults to name if not provided
|
|
27
|
+
|
|
28
|
+
# Existing fields
|
|
20
29
|
description: str = ""
|
|
21
30
|
agent_types: List[str] = None # Which agent types can use this skill
|
|
22
31
|
|
|
32
|
+
# Optional metadata
|
|
33
|
+
updated_at: Optional[str] = None
|
|
34
|
+
tags: List[str] = None
|
|
35
|
+
|
|
23
36
|
def __post_init__(self):
|
|
24
|
-
"""Initialize
|
|
37
|
+
"""Initialize default values if not provided."""
|
|
25
38
|
if self.agent_types is None:
|
|
26
39
|
self.agent_types = []
|
|
40
|
+
if self.tags is None:
|
|
41
|
+
self.tags = []
|
|
42
|
+
if not self.skill_id:
|
|
43
|
+
self.skill_id = self.name
|
|
27
44
|
|
|
28
45
|
|
|
29
46
|
class SkillsRegistry:
|
|
@@ -36,6 +53,28 @@ class SkillsRegistry:
|
|
|
36
53
|
self._load_user_skills()
|
|
37
54
|
self._load_project_skills()
|
|
38
55
|
|
|
56
|
+
def _parse_skill_frontmatter(self, content: str) -> Dict[str, Any]:
|
|
57
|
+
"""Parse YAML frontmatter from skill markdown file.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Dict with frontmatter fields or empty dict if no frontmatter
|
|
61
|
+
"""
|
|
62
|
+
# Check for YAML frontmatter
|
|
63
|
+
if not content.startswith("---"):
|
|
64
|
+
return {}
|
|
65
|
+
|
|
66
|
+
# Extract frontmatter (match: ---\n...yaml...\n---\nrest)
|
|
67
|
+
match = re.match(r"^---\n(.*?)\n---\n(.*)$", content, re.DOTALL)
|
|
68
|
+
if not match:
|
|
69
|
+
return {}
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
frontmatter = yaml.safe_load(match.group(1))
|
|
73
|
+
return frontmatter or {}
|
|
74
|
+
except yaml.YAMLError as e:
|
|
75
|
+
logger.warning(f"Failed to parse skill frontmatter: {e}")
|
|
76
|
+
return {}
|
|
77
|
+
|
|
39
78
|
def _load_bundled_skills(self):
|
|
40
79
|
"""Load skills bundled with MPM."""
|
|
41
80
|
bundled_dir = Path(__file__).parent / "bundled"
|
|
@@ -49,21 +88,36 @@ class SkillsRegistry:
|
|
|
49
88
|
skill_name = skill_file.stem
|
|
50
89
|
content = skill_file.read_text(encoding="utf-8")
|
|
51
90
|
|
|
52
|
-
#
|
|
53
|
-
|
|
91
|
+
# Parse frontmatter
|
|
92
|
+
frontmatter = self._parse_skill_frontmatter(content)
|
|
93
|
+
|
|
94
|
+
# Extract version fields from frontmatter
|
|
95
|
+
version = frontmatter.get("skill_version", "0.1.0")
|
|
96
|
+
skill_id = frontmatter.get("skill_id", skill_name)
|
|
97
|
+
updated_at = frontmatter.get("updated_at")
|
|
98
|
+
tags = frontmatter.get("tags", [])
|
|
99
|
+
|
|
100
|
+
# Extract description (from frontmatter or fallback to content parsing)
|
|
101
|
+
description = frontmatter.get("description", "")
|
|
102
|
+
if not description:
|
|
103
|
+
description = self._extract_description(content)
|
|
54
104
|
|
|
55
105
|
self.skills[skill_name] = Skill(
|
|
56
106
|
name=skill_name,
|
|
57
107
|
path=skill_file,
|
|
58
108
|
content=content,
|
|
59
109
|
source="bundled",
|
|
110
|
+
version=version,
|
|
111
|
+
skill_id=skill_id,
|
|
60
112
|
description=description,
|
|
113
|
+
updated_at=updated_at,
|
|
114
|
+
tags=tags,
|
|
61
115
|
)
|
|
62
116
|
skill_count += 1
|
|
63
117
|
except Exception as e:
|
|
64
118
|
logger.error(f"Error loading bundled skill {skill_file}: {e}")
|
|
65
119
|
|
|
66
|
-
logger.
|
|
120
|
+
logger.debug(f"Loaded {skill_count} bundled skills")
|
|
67
121
|
|
|
68
122
|
def _load_user_skills(self):
|
|
69
123
|
"""Load user-installed skills from ~/.claude/skills/"""
|
|
@@ -78,14 +132,31 @@ class SkillsRegistry:
|
|
|
78
132
|
skill_name = skill_file.stem
|
|
79
133
|
# User skills override bundled skills
|
|
80
134
|
content = skill_file.read_text(encoding="utf-8")
|
|
81
|
-
|
|
135
|
+
|
|
136
|
+
# Parse frontmatter
|
|
137
|
+
frontmatter = self._parse_skill_frontmatter(content)
|
|
138
|
+
|
|
139
|
+
# Extract version fields from frontmatter
|
|
140
|
+
version = frontmatter.get("skill_version", "0.1.0")
|
|
141
|
+
skill_id = frontmatter.get("skill_id", skill_name)
|
|
142
|
+
updated_at = frontmatter.get("updated_at")
|
|
143
|
+
tags = frontmatter.get("tags", [])
|
|
144
|
+
|
|
145
|
+
# Extract description (from frontmatter or fallback to content parsing)
|
|
146
|
+
description = frontmatter.get("description", "")
|
|
147
|
+
if not description:
|
|
148
|
+
description = self._extract_description(content)
|
|
82
149
|
|
|
83
150
|
self.skills[skill_name] = Skill(
|
|
84
151
|
name=skill_name,
|
|
85
152
|
path=skill_file,
|
|
86
153
|
content=content,
|
|
87
154
|
source="user",
|
|
155
|
+
version=version,
|
|
156
|
+
skill_id=skill_id,
|
|
88
157
|
description=description,
|
|
158
|
+
updated_at=updated_at,
|
|
159
|
+
tags=tags,
|
|
89
160
|
)
|
|
90
161
|
skill_count += 1
|
|
91
162
|
logger.debug(f"User skill '{skill_name}' overrides bundled version")
|
|
@@ -93,7 +164,7 @@ class SkillsRegistry:
|
|
|
93
164
|
logger.error(f"Error loading user skill {skill_file}: {e}")
|
|
94
165
|
|
|
95
166
|
if skill_count > 0:
|
|
96
|
-
logger.
|
|
167
|
+
logger.debug(f"Loaded {skill_count} user skills")
|
|
97
168
|
|
|
98
169
|
def _load_project_skills(self):
|
|
99
170
|
"""Load project-specific skills from .claude/skills/"""
|
|
@@ -108,14 +179,31 @@ class SkillsRegistry:
|
|
|
108
179
|
skill_name = skill_file.stem
|
|
109
180
|
# Project skills override both user and bundled skills
|
|
110
181
|
content = skill_file.read_text(encoding="utf-8")
|
|
111
|
-
|
|
182
|
+
|
|
183
|
+
# Parse frontmatter
|
|
184
|
+
frontmatter = self._parse_skill_frontmatter(content)
|
|
185
|
+
|
|
186
|
+
# Extract version fields from frontmatter
|
|
187
|
+
version = frontmatter.get("skill_version", "0.1.0")
|
|
188
|
+
skill_id = frontmatter.get("skill_id", skill_name)
|
|
189
|
+
updated_at = frontmatter.get("updated_at")
|
|
190
|
+
tags = frontmatter.get("tags", [])
|
|
191
|
+
|
|
192
|
+
# Extract description (from frontmatter or fallback to content parsing)
|
|
193
|
+
description = frontmatter.get("description", "")
|
|
194
|
+
if not description:
|
|
195
|
+
description = self._extract_description(content)
|
|
112
196
|
|
|
113
197
|
self.skills[skill_name] = Skill(
|
|
114
198
|
name=skill_name,
|
|
115
199
|
path=skill_file,
|
|
116
200
|
content=content,
|
|
117
201
|
source="project",
|
|
202
|
+
version=version,
|
|
203
|
+
skill_id=skill_id,
|
|
118
204
|
description=description,
|
|
205
|
+
updated_at=updated_at,
|
|
206
|
+
tags=tags,
|
|
119
207
|
)
|
|
120
208
|
skill_count += 1
|
|
121
209
|
logger.debug(f"Project skill '{skill_name}' overrides other versions")
|
|
@@ -123,7 +211,7 @@ class SkillsRegistry:
|
|
|
123
211
|
logger.error(f"Error loading project skill {skill_file}: {e}")
|
|
124
212
|
|
|
125
213
|
if skill_count > 0:
|
|
126
|
-
logger.
|
|
214
|
+
logger.debug(f"Loaded {skill_count} project skills")
|
|
127
215
|
|
|
128
216
|
def _extract_description(self, content: str) -> str:
|
|
129
217
|
"""Extract description from skill content (first paragraph or summary)."""
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-mpm
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.17.0
|
|
4
4
|
Summary: Claude Multi-Agent Project Manager - Orchestrate Claude with agent delegation and ticket tracking
|
|
5
5
|
Author-email: Bob Matsuoka <bob@matsuoka.com>
|
|
6
6
|
Maintainer: Claude MPM Team
|
|
@@ -157,7 +157,7 @@ A powerful orchestration framework for **Claude Code (CLI)** that enables multi-
|
|
|
157
157
|
## Features
|
|
158
158
|
|
|
159
159
|
- 🤖 **Multi-Agent System**: 15 specialized agents for comprehensive project management
|
|
160
|
-
- 🎯 **Skills System**:
|
|
160
|
+
- 🎯 **Skills System**: 20 bundled skills with auto-linking, three-tier organization (bundled/user/project), and interactive configuration
|
|
161
161
|
- 🧠 **Persistent Knowledge System**: Project-specific kuzu-memory integration for intelligent context retention
|
|
162
162
|
- 🔄 **Session Management**: Resume previous sessions with `--resume`
|
|
163
163
|
- 📊 **Real-Time Monitoring**: Live dashboard with `--monitor` flag
|
|
@@ -310,18 +310,24 @@ Agents learn project-specific patterns using a simple list format and can update
|
|
|
310
310
|
|
|
311
311
|
Claude MPM includes a powerful skills system that eliminates redundant agent guidance through reusable skill modules:
|
|
312
312
|
|
|
313
|
-
**
|
|
313
|
+
**20 Bundled Skills** covering essential development workflows (all versioned starting at 0.1.0):
|
|
314
314
|
- Git workflow, TDD, code review, systematic debugging
|
|
315
315
|
- API documentation, refactoring patterns, performance profiling
|
|
316
316
|
- Docker containerization, database migrations, security scanning
|
|
317
317
|
- JSON/PDF/XLSX handling, async testing, ImageMagick operations
|
|
318
318
|
- Local development servers: Next.js, FastAPI, Vite, Express
|
|
319
|
+
- Web performance: Lighthouse metrics, Core Web Vitals optimization
|
|
319
320
|
|
|
320
321
|
**Three-Tier Organization:**
|
|
321
322
|
- **Bundled**: Core skills included with Claude MPM (~15,000 lines of reusable guidance)
|
|
322
323
|
- **User**: Custom skills in `~/.config/claude-mpm/skills/`
|
|
323
324
|
- **Project**: Project-specific skills in `.claude-mpm/skills/`
|
|
324
325
|
|
|
326
|
+
**Version Tracking:**
|
|
327
|
+
- All skills support semantic versioning (MAJOR.MINOR.PATCH)
|
|
328
|
+
- Check versions with `/mpm-version` command in Claude Code
|
|
329
|
+
- See [Skills Versioning Guide](docs/user/skills-versioning.md) for details
|
|
330
|
+
|
|
325
331
|
**Quick Access:**
|
|
326
332
|
```bash
|
|
327
333
|
# Interactive skills management
|
|
@@ -395,13 +401,17 @@ See [docs/MEMORY.md](docs/MEMORY.md) and [docs/developer/11-dashboard/README.md]
|
|
|
395
401
|
- **Single Entry Point**: [docs/README.md](docs/README.md) is your navigation hub
|
|
396
402
|
- **Clear User Paths**: Organized by user type and experience level
|
|
397
403
|
- **Cross-Referenced**: Links between related topics and sections
|
|
398
|
-
- **Up-to-Date**: Version 4.16.
|
|
404
|
+
- **Up-to-Date**: Version 4.16.3 with web performance optimization skill
|
|
405
|
+
|
|
406
|
+
## Recent Updates (v4.16.3)
|
|
407
|
+
|
|
408
|
+
**Web Performance Optimization**: New `web-performance-optimization` skill for Lighthouse metrics, Core Web Vitals (LCP, INP, CLS), and framework-specific optimization patterns.
|
|
399
409
|
|
|
400
|
-
##
|
|
410
|
+
## Previous Updates (v4.16.1)
|
|
401
411
|
|
|
402
412
|
**Local Development Skills**: Added 4 new toolchain-specific skills: `nextjs-local-dev`, `fastapi-local-dev`, `vite-local-dev`, and `express-local-dev` for professional local server management with PM2, HMR, and production-grade patterns.
|
|
403
413
|
|
|
404
|
-
**Skills System Integration**:
|
|
414
|
+
**Skills System Integration**: 20 bundled skills with auto-linking, three-tier organization, and interactive configuration. Eliminates 85% of redundant guidance across agent templates (~15,000 lines of reusable content).
|
|
405
415
|
|
|
406
416
|
**Enhanced Documentation**: Complete documentation suite with PDF guides, reorganized structure, and comprehensive design documents for skills integration.
|
|
407
417
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
|
|
2
|
-
claude_mpm/VERSION,sha256=
|
|
2
|
+
claude_mpm/VERSION,sha256=gcqSJiDcvkT2MvHps7QUQIB-YbkjM5C4D4UbMZrAlLI,7
|
|
3
3
|
claude_mpm/__init__.py,sha256=UCw6j9e_tZQ3kJtTqmdfNv7MHyw9nD1jkj80WurwM2g,2064
|
|
4
4
|
claude_mpm/__main__.py,sha256=Ro5UBWBoQaSAIoSqWAr7zkbLyvi4sSy28WShqAhKJG0,723
|
|
5
5
|
claude_mpm/constants.py,sha256=sLjJF6Kw7H4V9WWeaEYltM-77TgXqzEMX5vx4ukM5-0,5977
|
|
@@ -172,13 +172,14 @@ claude_mpm/commands/mpm-agents.md,sha256=Mq1BOVP6ejRLYZCHE-K1fZ2HaiND_BaYEfc9SO5
|
|
|
172
172
|
claude_mpm/commands/mpm-auto-configure.md,sha256=vJtXiaEiujmozhKhqU8GsO95gHLs0QQAzkyYfqPkgzQ,5130
|
|
173
173
|
claude_mpm/commands/mpm-config.md,sha256=79Eb-srRpEVV3HCHDHZc8SKec6_LVP6HbXDEVkZKLgw,2929
|
|
174
174
|
claude_mpm/commands/mpm-doctor.md,sha256=ut5LhFKVRw-2ecjMSPsnaTiRuFXa6Q9t-Wgl3CCnQvk,590
|
|
175
|
-
claude_mpm/commands/mpm-help.md,sha256=
|
|
175
|
+
claude_mpm/commands/mpm-help.md,sha256=8lo0mvhAjFI124hAGX4G8iwkz1k3xDv2QT2Jbyqeg_8,6891
|
|
176
176
|
claude_mpm/commands/mpm-init.md,sha256=wwYHkToq8U5ALdhu8bDPygqAsKZ77aMaai7ZJC3oBqU,16054
|
|
177
177
|
claude_mpm/commands/mpm-monitor.md,sha256=onTHf9Yac1KkdZdENtY2Q5jyw0A-vZLYgoKkPCtZLUY,12193
|
|
178
178
|
claude_mpm/commands/mpm-organize.md,sha256=T-ysjhwgfW9irjUj02vuY_1jeMdabO_zxcShyjmqsiM,10153
|
|
179
179
|
claude_mpm/commands/mpm-status.md,sha256=oaM4ybL4ffp55nkT9F0mp_5H4tF-wX9mbqK-LEKEqUU,1919
|
|
180
180
|
claude_mpm/commands/mpm-tickets.md,sha256=a2_mW56QDhw7-jMU92ycGaxvSSYpNoQFGhkWbr3MJ88,2356
|
|
181
|
-
claude_mpm/commands/mpm.md,sha256=
|
|
181
|
+
claude_mpm/commands/mpm-version.md,sha256=lwI2QiRYKfA6L5y_FGL8Nkb-4GtO2Z4iuNBbMvfx6Hs,2648
|
|
182
|
+
claude_mpm/commands/mpm.md,sha256=_VwGAZPYruPW9Rdh0_xOZWDxVrE3KOT00G7FvPkq_T4,636
|
|
182
183
|
claude_mpm/config/__init__.py,sha256=V2dyJQ8_gVCpNiCg8zYTQqE1RSeON5Zm8n5Ndkqhp1g,916
|
|
183
184
|
claude_mpm/config/agent_config.py,sha256=sICpvJoOuJGRzdSIMWvC9ECzKTKF-3Psi-ATSaZQ9LU,14860
|
|
184
185
|
claude_mpm/config/experimental_features.py,sha256=cH95HqMUEQL-_Hs833dAAC33GHMUE5e26qpOyiEtBWI,7546
|
|
@@ -469,7 +470,7 @@ claude_mpm/services/subprocess_launcher_service.py,sha256=lYSlg2G_oDAv1dHrOdHaOE
|
|
|
469
470
|
claude_mpm/services/system_instructions_service.py,sha256=eub7WjM1g1hda-k6n6VvKnHehOAAPGDNtGEO7SNTZZ8,10016
|
|
470
471
|
claude_mpm/services/ticket_manager.py,sha256=LpmbUFo7OkG48leZscHIvNoHY_thLWh2wquFxSfDg-o,785
|
|
471
472
|
claude_mpm/services/utility_service.py,sha256=bFxDiQTisdAL3dOU9lucHdDW9T8sW1_9u6o7wKp0n1o,8435
|
|
472
|
-
claude_mpm/services/version_service.py,sha256=
|
|
473
|
+
claude_mpm/services/version_service.py,sha256=QSCEVZ1yrbT2OrqjiFaGhT0oPJSMCX9Z84KMwwt6dNs,13986
|
|
473
474
|
claude_mpm/services/agents/__init__.py,sha256=ZkES34SfCrTzWjdoCZExRccPHXXWEBzech6dNEb3T9g,2547
|
|
474
475
|
claude_mpm/services/agents/agent_builder.py,sha256=vXXz7GbCoBidNs7VfyQVwB4fTslD_joAw5HP6Ac8_kM,14950
|
|
475
476
|
claude_mpm/services/agents/auto_config_manager.py,sha256=Eq3u0Zvc8nqDgp-aHYpVFv44UrEG-gPKQSr6hrM5GHA,30705
|
|
@@ -826,7 +827,7 @@ claude_mpm/services/version_control/version_parser.py,sha256=DbNncYZKKy9--ZUCO9g
|
|
|
826
827
|
claude_mpm/services/visualization/__init__.py,sha256=cTtWxRi07rSLXQKVZa7SKZsYfj6nRouw7HVO85Towfg,401
|
|
827
828
|
claude_mpm/services/visualization/mermaid_generator.py,sha256=6QGgXtMg_N9rKeRn8wYs3IxuWGKdDVAwFMFWKfIw9s4,34277
|
|
828
829
|
claude_mpm/skills/__init__.py,sha256=Z_QNFaW2t_Um5q4icqs9xSgoNKhAPbs5Ny7rMKizBsM,497
|
|
829
|
-
claude_mpm/skills/registry.py,sha256=
|
|
830
|
+
claude_mpm/skills/registry.py,sha256=P4CsN7FylbxIrxuMD8LKVjOv6SLrMJunwvDHPvYqS7U,10233
|
|
830
831
|
claude_mpm/skills/skill_manager.py,sha256=6QaC0B3e8hVVj7FWV6fCr8-SGbnguoXmErUujnXGWCo,10445
|
|
831
832
|
claude_mpm/skills/bundled/__init__.py,sha256=rGZR4FYam6sN_fCzP7l1OpEn4pIJI8UYI_89ErnwSRU,152
|
|
832
833
|
claude_mpm/storage/__init__.py,sha256=DXnmee6iGqC6ctFLW7_Ty1cVCjYDFuCMkwO4EV0i25k,274
|
|
@@ -862,9 +863,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
|
|
|
862
863
|
claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
|
|
863
864
|
claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
|
|
864
865
|
claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
|
|
865
|
-
claude_mpm-4.
|
|
866
|
-
claude_mpm-4.
|
|
867
|
-
claude_mpm-4.
|
|
868
|
-
claude_mpm-4.
|
|
869
|
-
claude_mpm-4.
|
|
870
|
-
claude_mpm-4.
|
|
866
|
+
claude_mpm-4.17.0.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
|
|
867
|
+
claude_mpm-4.17.0.dist-info/METADATA,sha256=EsV5rm9VJK_49wDIiq7QuZ4PCayhqI7rzc1yZZeFc6U,20218
|
|
868
|
+
claude_mpm-4.17.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
869
|
+
claude_mpm-4.17.0.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
|
|
870
|
+
claude_mpm-4.17.0.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
|
|
871
|
+
claude_mpm-4.17.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|