claude-mpm 4.16.3__py3-none-any.whl → 4.17.1__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.

Files changed (32) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/commands/mpm-help.md +3 -0
  3. claude_mpm/commands/mpm-version.md +113 -0
  4. claude_mpm/commands/mpm.md +1 -0
  5. claude_mpm/services/version_service.py +104 -1
  6. claude_mpm/skills/bundled/api-documentation.md +393 -0
  7. claude_mpm/skills/bundled/async-testing.md +571 -0
  8. claude_mpm/skills/bundled/code-review.md +143 -0
  9. claude_mpm/skills/bundled/database-migration.md +199 -0
  10. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  11. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  12. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  13. claude_mpm/skills/bundled/git-workflow.md +414 -0
  14. claude_mpm/skills/bundled/imagemagick.md +204 -0
  15. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  16. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  17. claude_mpm/skills/bundled/pdf.md +141 -0
  18. claude_mpm/skills/bundled/performance-profiling.md +567 -0
  19. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  20. claude_mpm/skills/bundled/security-scanning.md +327 -0
  21. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  22. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  23. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  24. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  25. claude_mpm/skills/bundled/xlsx.md +157 -0
  26. claude_mpm/skills/registry.py +97 -9
  27. {claude_mpm-4.16.3.dist-info → claude_mpm-4.17.1.dist-info}/METADATA +7 -2
  28. {claude_mpm-4.16.3.dist-info → claude_mpm-4.17.1.dist-info}/RECORD +32 -11
  29. {claude_mpm-4.16.3.dist-info → claude_mpm-4.17.1.dist-info}/WHEEL +0 -0
  30. {claude_mpm-4.16.3.dist-info → claude_mpm-4.17.1.dist-info}/entry_points.txt +0 -0
  31. {claude_mpm-4.16.3.dist-info → claude_mpm-4.17.1.dist-info}/licenses/LICENSE +0 -0
  32. {claude_mpm-4.16.3.dist-info → claude_mpm-4.17.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,157 @@
1
+ ---
2
+ skill_id: xlsx
3
+ skill_version: 0.1.0
4
+ description: Working with Excel files programmatically.
5
+ updated_at: 2025-10-30T17:00:00Z
6
+ tags: [excel, xlsx, spreadsheet, data]
7
+ ---
8
+
9
+ # Excel/XLSX Manipulation
10
+
11
+ Working with Excel files programmatically.
12
+
13
+ ## Python (openpyxl)
14
+
15
+ ### Reading Excel
16
+ ```python
17
+ from openpyxl import load_workbook
18
+
19
+ wb = load_workbook('data.xlsx')
20
+ ws = wb.active # Get active sheet
21
+
22
+ # Read cell
23
+ value = ws['A1'].value
24
+
25
+ # Iterate rows
26
+ for row in ws.iter_rows(min_row=2, values_only=True):
27
+ print(row)
28
+ ```
29
+
30
+ ### Writing Excel
31
+ ```python
32
+ from openpyxl import Workbook
33
+
34
+ wb = Workbook()
35
+ ws = wb.active
36
+ ws.title = "Data"
37
+
38
+ # Write data
39
+ ws['A1'] = 'Name'
40
+ ws['B1'] = 'Age'
41
+ ws.append(['John', 30])
42
+ ws.append(['Jane', 25])
43
+
44
+ wb.save('output.xlsx')
45
+ ```
46
+
47
+ ### Formatting
48
+ ```python
49
+ from openpyxl.styles import Font, PatternFill
50
+
51
+ # Bold header
52
+ ws['A1'].font = Font(bold=True)
53
+
54
+ # Background color
55
+ ws['A1'].fill = PatternFill(start_color="FFFF00", fill_type="solid")
56
+
57
+ # Number format
58
+ ws['B2'].number_format = '0.00' # Two decimals
59
+ ```
60
+
61
+ ### Formulas
62
+ ```python
63
+ # Add formula
64
+ ws['C2'] = '=A2+B2'
65
+
66
+ # Sum column
67
+ ws['D10'] = '=SUM(D2:D9)'
68
+ ```
69
+
70
+ ## Python (pandas)
71
+
72
+ ### Reading Excel
73
+ ```python
74
+ import pandas as pd
75
+
76
+ # Read sheet
77
+ df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
78
+
79
+ # Read multiple sheets
80
+ dfs = pd.read_excel('data.xlsx', sheet_name=None)
81
+ ```
82
+
83
+ ### Writing Excel
84
+ ```python
85
+ # Write DataFrame
86
+ df.to_excel('output.xlsx', index=False)
87
+
88
+ # Multiple sheets
89
+ with pd.ExcelWriter('output.xlsx') as writer:
90
+ df1.to_excel(writer, sheet_name='Sheet1')
91
+ df2.to_excel(writer, sheet_name='Sheet2')
92
+ ```
93
+
94
+ ### Data Transformation
95
+ ```python
96
+ # Filter
97
+ filtered = df[df['Age'] > 25]
98
+
99
+ # Group by
100
+ grouped = df.groupby('Department')['Salary'].mean()
101
+
102
+ # Pivot
103
+ pivot = df.pivot_table(values='Sales', index='Region', columns='Product')
104
+ ```
105
+
106
+ ## JavaScript (xlsx)
107
+
108
+ ```javascript
109
+ import XLSX from 'xlsx';
110
+
111
+ // Read file
112
+ const workbook = XLSX.readFile('data.xlsx');
113
+ const sheetName = workbook.SheetNames[0];
114
+ const worksheet = workbook.Sheets[sheetName];
115
+
116
+ // Convert to JSON
117
+ const data = XLSX.utils.sheet_to_json(worksheet);
118
+
119
+ // Write file
120
+ const newWorksheet = XLSX.utils.json_to_sheet(data);
121
+ const newWorkbook = XLSX.utils.book_new();
122
+ XLSX.utils.book_append_sheet(newWorkbook, newWorksheet, 'Data');
123
+ XLSX.writeFile(newWorkbook, 'output.xlsx');
124
+ ```
125
+
126
+ ## Common Operations
127
+
128
+ ### CSV to Excel
129
+ ```python
130
+ import pandas as pd
131
+
132
+ df = pd.read_csv('data.csv')
133
+ df.to_excel('data.xlsx', index=False)
134
+ ```
135
+
136
+ ### Excel to CSV
137
+ ```python
138
+ df = pd.read_excel('data.xlsx')
139
+ df.to_csv('data.csv', index=False)
140
+ ```
141
+
142
+ ### Merging Excel Files
143
+ ```python
144
+ dfs = []
145
+ for file in ['file1.xlsx', 'file2.xlsx', 'file3.xlsx']:
146
+ df = pd.read_excel(file)
147
+ dfs.append(df)
148
+
149
+ combined = pd.concat(dfs, ignore_index=True)
150
+ combined.to_excel('merged.xlsx', index=False)
151
+ ```
152
+
153
+ ## Remember
154
+ - Close workbooks after use
155
+ - Handle large files in chunks
156
+ - Validate data before writing
157
+ - Use pandas for data analysis, openpyxl for formatting
@@ -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 agent_types list if not provided."""
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
- # Extract description from first paragraph if available
53
- description = self._extract_description(content)
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.info(f"Loaded {skill_count} bundled skills")
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
- description = self._extract_description(content)
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.info(f"Loaded {skill_count} user skills")
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
- description = self._extract_description(content)
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.info(f"Loaded {skill_count} project skills")
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.16.3
3
+ Version: 4.17.1
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
@@ -310,7 +310,7 @@ 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
- **20 Bundled Skills** covering essential development workflows:
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
@@ -323,6 +323,11 @@ Claude MPM includes a powerful skills system that eliminates redundant agent gui
323
323
  - **User**: Custom skills in `~/.config/claude-mpm/skills/`
324
324
  - **Project**: Project-specific skills in `.claude-mpm/skills/`
325
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
+
326
331
  **Quick Access:**
327
332
  ```bash
328
333
  # Interactive skills management
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
2
- claude_mpm/VERSION,sha256=o5tTrnu_kXGLHr9hrGq-Zty3TkxyzWR3kuzZB68XxLM,7
2
+ claude_mpm/VERSION,sha256=RB2gUKMx5VBa3nbppW0YC1fQBvNMIBg7TEJB0kbNlyk,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=DGvnR5XLWJVygYCZis2Gh6RP1INj9DycO1FqAdwoegY,6751
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=tv_Mr6p2olRKIltKui4ljfCNG69VokkyIg951CeMBas,559
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=Ql2HKB9OoHGdqkfWyFFLSSVBwShap0dFIjbmTXrf6dE,10163
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,9 +827,29 @@ 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=Ooc2leMunyb52uNaCKK4MB60QhP8ErWFO1oJe0YlBQc,6904
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
833
+ claude_mpm/skills/bundled/api-documentation.md,sha256=lPPvsgtyiPSIT8WeiJtm9g8TRaBtYu5Z9HX3caGi_ME,9492
834
+ claude_mpm/skills/bundled/async-testing.md,sha256=KOdBa6Pa1EPEIljmH1v2tukrsu9NW3c-RiXaee0rJfQ,13010
835
+ claude_mpm/skills/bundled/code-review.md,sha256=QFO0tzyLPDkhva1aLu4xh5Dsen0S4wVQTC9eFXkstTQ,2870
836
+ claude_mpm/skills/bundled/database-migration.md,sha256=oJ6F18Keax74gw5TINhQp127OrCuzB05w4hLX0REdRk,4149
837
+ claude_mpm/skills/bundled/docker-containerization.md,sha256=7jEcuakGM7YWNLUGZhPq09ot_sUqkS3k8sgCpwmx6WQ,3097
838
+ claude_mpm/skills/bundled/express-local-dev.md,sha256=GsMLgxNy4LQsqswsS5JMrjLgLIN50pc7xX6KH89a_rA,31300
839
+ claude_mpm/skills/bundled/fastapi-local-dev.md,sha256=RTU7AdNYPM_N1or1yq7H7p4OQknqMpxKZAE8-OytC-s,25453
840
+ claude_mpm/skills/bundled/git-workflow.md,sha256=M6KyCxykf6_B1d0HQ428MCBJiSkIW0nvTguoHho9lCg,7452
841
+ claude_mpm/skills/bundled/imagemagick.md,sha256=RBybqF7JUsJTCBE4gmJmdOe-fzXvmUlAdXXEZmOX3GA,4135
842
+ claude_mpm/skills/bundled/json-data-handling.md,sha256=_mmNaFakJswbCpaqGy-BHwLNkdPaFEGb93nRi5Ajzao,4550
843
+ claude_mpm/skills/bundled/nextjs-local-dev.md,sha256=a0QvHw7tokJDD4NudvOjR38vsMbSU5pQbOXihfjgWrQ,16468
844
+ claude_mpm/skills/bundled/pdf.md,sha256=xYDfklEGIzc7liMMAYVnkuwb6KEKHPd3YGMq9NCGWcg,2857
845
+ claude_mpm/skills/bundled/performance-profiling.md,sha256=n_ZcgY1YVwUnWioYkTnAU5X5F8gwG6B9r1BTj7Ai_oo,12264
846
+ claude_mpm/skills/bundled/refactoring-patterns.md,sha256=JSZDm7w0kpxP-GCpK9bevEMFxEKfTu4vl7QJNrhl0E0,3809
847
+ claude_mpm/skills/bundled/security-scanning.md,sha256=9j-AdA9IcpIxe-rThajBxk05OXL_uCxLjXPtlLZ7PzI,7577
848
+ claude_mpm/skills/bundled/systematic-debugging.md,sha256=-HeIPw3n13YmkF2Kr07CmA64HWbBFFhtkXxUw9vNM_c,11773
849
+ claude_mpm/skills/bundled/test-driven-development.md,sha256=UqZvDyGzyjsxHBuryI0J5gvbeAeP5itQOyV87sanJpU,8913
850
+ claude_mpm/skills/bundled/vite-local-dev.md,sha256=Ypc3RMAiUXTUzmrvTx4v5LERsz8BaYDyJUJXi3jzkq4,21063
851
+ claude_mpm/skills/bundled/web-performance-optimization.md,sha256=bG1sm1VxrZgetwuTAQjCZp-oT_2lMh6OUgyGvkFiPDw,52937
852
+ claude_mpm/skills/bundled/xlsx.md,sha256=OwcXT9ADlBtySqzO529HTPpEH_xn6Ue6caQbjYQ_GIc,2969
832
853
  claude_mpm/storage/__init__.py,sha256=DXnmee6iGqC6ctFLW7_Ty1cVCjYDFuCMkwO4EV0i25k,274
833
854
  claude_mpm/storage/state_storage.py,sha256=6jEZ4z35MjtAuTTUdqETTy4_dbMMK8EN_C2kVa62PjY,16811
834
855
  claude_mpm/tools/__init__.py,sha256=T3GuCYNAHtjVcKCeivY674PaDm48WX96AriQfTKUknY,347
@@ -862,9 +883,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
862
883
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
863
884
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
864
885
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
865
- claude_mpm-4.16.3.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
866
- claude_mpm-4.16.3.dist-info/METADATA,sha256=dwsJvDHo10mlW6tNogA9LI1thNiTrJAOqgvx_gCQ7hA,19964
867
- claude_mpm-4.16.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
868
- claude_mpm-4.16.3.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
869
- claude_mpm-4.16.3.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
870
- claude_mpm-4.16.3.dist-info/RECORD,,
886
+ claude_mpm-4.17.1.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
887
+ claude_mpm-4.17.1.dist-info/METADATA,sha256=6V6ppc5htwPwVyXbIR4_iMxieQN8v45c-n5LBHDGH4I,20218
888
+ claude_mpm-4.17.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
889
+ claude_mpm-4.17.1.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
890
+ claude_mpm-4.17.1.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
891
+ claude_mpm-4.17.1.dist-info/RECORD,,