claude-mpm 4.7.3__py3-none-any.whl → 4.7.5__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.
@@ -204,23 +204,6 @@
204
204
  <div class="header-row">
205
205
  <div class="header-title">
206
206
  <h1>🚀 Claude MPM Monitor</h1>
207
- <a href="/static/monitors-index.html" style="
208
- display: inline-block;
209
- margin-left: 20px;
210
- padding: 8px 16px;
211
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
212
- color: white;
213
- text-decoration: none;
214
- border-radius: 8px;
215
- font-size: 14px;
216
- font-weight: 500;
217
- transition: transform 0.2s, box-shadow 0.2s;
218
- vertical-align: middle;
219
- "
220
- onmouseover="this.style.transform='translateY(-2px)'; this.style.boxShadow='0 5px 15px rgba(102, 126, 234, 0.4)';"
221
- onmouseout="this.style.transform=''; this.style.boxShadow='';">
222
- Try New Dashboard →
223
- </a>
224
207
  <div id="connection-status" class="status-badge status-disconnected">
225
208
  <span>●</span> Disconnected
226
209
  </div>
@@ -150,23 +150,6 @@
150
150
  <div class="header-row">
151
151
  <div class="header-title">
152
152
  <h1>🚀 Claude MPM Monitor</h1>
153
- <a href="/static/monitors-index.html" style="
154
- display: inline-block;
155
- margin-left: 20px;
156
- padding: 8px 16px;
157
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
158
- color: white;
159
- text-decoration: none;
160
- border-radius: 8px;
161
- font-size: 14px;
162
- font-weight: 500;
163
- transition: transform 0.2s, box-shadow 0.2s;
164
- vertical-align: middle;
165
- "
166
- onmouseover="this.style.transform='translateY(-2px)'; this.style.boxShadow='0 5px 15px rgba(102, 126, 234, 0.4)';"
167
- onmouseout="this.style.transform=''; this.style.boxShadow='';">
168
- Try New Dashboard →
169
- </a>
170
153
  <div id="connection-status" class="status-badge status-disconnected">
171
154
  <span>●</span> Disconnected
172
155
  </div>
@@ -16,6 +16,7 @@ Author: Claude MPM Development Team
16
16
  Created: 2025-01-26
17
17
  """
18
18
 
19
+ import os
19
20
  import subprocess
20
21
  from datetime import datetime, timedelta, timezone
21
22
  from pathlib import Path
@@ -32,10 +33,36 @@ console = Console()
32
33
  class EnhancedProjectAnalyzer:
33
34
  """Enhanced project analyzer with git history support."""
34
35
 
35
- def __init__(self, project_path: Path):
36
- """Initialize the enhanced analyzer."""
37
- self.project_path = project_path
38
- self.is_git_repo = (project_path / ".git").exists()
36
+ def __init__(self, project_path: Optional[Path] = None):
37
+ """
38
+ Initialize the enhanced analyzer.
39
+
40
+ Args:
41
+ project_path: Path to the project. If None, uses CLAUDE_MPM_USER_PWD
42
+ environment variable or current working directory.
43
+ """
44
+ # Determine project path with proper priority
45
+ if project_path is None:
46
+ # Try environment variable first (user's project, not framework)
47
+ env_path = os.getenv("CLAUDE_MPM_USER_PWD")
48
+ if env_path:
49
+ self.project_path = Path(env_path)
50
+ else:
51
+ self.project_path = Path.cwd()
52
+ else:
53
+ self.project_path = project_path
54
+
55
+ # Ensure path is absolute
56
+ if not self.project_path.is_absolute():
57
+ self.project_path = self.project_path.resolve()
58
+
59
+ # Check if it's a git repository
60
+ git_dir = self.project_path / ".git"
61
+ self.is_git_repo = git_dir.exists() and git_dir.is_dir()
62
+
63
+ # Log warning if not a git repository
64
+ if not self.is_git_repo:
65
+ logger.debug(f"Directory is not a git repository: {self.project_path}")
39
66
 
40
67
  def analyze_git_history(self, days_back: int = 30) -> Dict:
41
68
  """Analyze git history for recent changes and patterns."""
@@ -0,0 +1,260 @@
1
+ """
2
+ Display Helper for Rich Console Output.
3
+
4
+ WHY: Centralizes display formatting logic to reduce code duplication
5
+ across CLI commands. Provides reusable components for tables, panels,
6
+ reports, and structured output.
7
+ """
8
+
9
+ from typing import Any, Dict, List, Tuple
10
+
11
+ from rich.console import Console
12
+ from rich.panel import Panel
13
+ from rich.table import Table
14
+
15
+
16
+ class DisplayHelper:
17
+ """Centralized display formatting for Rich console output."""
18
+
19
+ def __init__(self, console: Console):
20
+ """Initialize display helper with console instance."""
21
+ self.console = console
22
+
23
+ def display_separator(self, char: str = "=", width: int = 60) -> None:
24
+ """Display a separator line."""
25
+ self.console.print(char * width)
26
+
27
+ def display_header(self, title: str, width: int = 60) -> None:
28
+ """Display a formatted header with separators."""
29
+ self.display_separator(width=width)
30
+ self.console.print(f"[bold]{title}[/bold]")
31
+ self.display_separator(width=width)
32
+ self.console.print()
33
+
34
+ def display_section_title(self, title: str, emoji: str = "") -> None:
35
+ """Display a section title with optional emoji."""
36
+ if emoji:
37
+ self.console.print(f"[bold cyan]{emoji} {title}[/bold cyan]")
38
+ else:
39
+ self.console.print(f"[bold cyan]{title}[/bold cyan]")
40
+
41
+ def display_key_value_table(
42
+ self,
43
+ title: str,
44
+ data: Dict[str, Any],
45
+ key_style: str = "cyan",
46
+ value_style: str = "white",
47
+ ) -> None:
48
+ """Display a two-column key-value table."""
49
+ table = Table(title=title, show_header=True)
50
+ table.add_column("Property", style=key_style)
51
+ table.add_column("Value", style=value_style)
52
+
53
+ for key, value in data.items():
54
+ # Handle various value types
55
+ if isinstance(value, bool):
56
+ display_value = "✓" if value else "✗"
57
+ elif isinstance(value, int) and key.lower().find("size") >= 0:
58
+ display_value = f"{value:,} characters"
59
+ else:
60
+ display_value = str(value)
61
+ table.add_row(key, display_value)
62
+
63
+ self.console.print(table)
64
+
65
+ def display_list_section(
66
+ self, title: str, items: List[str], max_items: int = 10, color: str = "white"
67
+ ) -> None:
68
+ """Display a titled list of items."""
69
+ self.console.print(f"\n[bold cyan]{title}[/bold cyan]")
70
+ for item in items[:max_items]:
71
+ self.console.print(f" [{color}]{item}[/{color}]")
72
+
73
+ def display_warning_list(self, title: str, items: List[str]) -> None:
74
+ """Display a list of warning items."""
75
+ self.console.print(f"\n[yellow]{title}[/yellow]")
76
+ for item in items:
77
+ self.console.print(f" • {item}")
78
+
79
+ def display_info_list(self, title: str, items: List[str]) -> None:
80
+ """Display a list of info items."""
81
+ self.console.print(f"\n[blue]{title}[/blue]")
82
+ for item in items[:5]:
83
+ self.console.print(f" • {item}")
84
+
85
+ def display_metric_row(
86
+ self, label: str, value: Any, indent: int = 2, warning: bool = False
87
+ ) -> None:
88
+ """Display a single metric row with label and value."""
89
+ indent_str = " " * indent
90
+ if warning:
91
+ self.console.print(f"{indent_str}[yellow]{label}: {value}[/yellow]")
92
+ else:
93
+ self.console.print(f"{indent_str}{label}: {value}")
94
+
95
+ def display_metrics_section(
96
+ self, title: str, metrics: Dict[str, Any], emoji: str = ""
97
+ ) -> None:
98
+ """Display a section with multiple metrics."""
99
+ self.display_section_title(title, emoji)
100
+ for label, value in metrics.items():
101
+ self.display_metric_row(label, value)
102
+
103
+ def display_report_section(
104
+ self,
105
+ title: str,
106
+ data: Dict[str, Any],
107
+ emoji: str = "",
108
+ show_warnings: bool = True,
109
+ ) -> None:
110
+ """Display a generic report section with data and optional warnings."""
111
+ self.display_section_title(title, emoji)
112
+
113
+ for key, value in data.items():
114
+ if isinstance(value, dict):
115
+ # Handle nested dictionaries
116
+ self.console.print(f" {key}:")
117
+ for sub_key, sub_value in value.items():
118
+ self.console.print(f" {sub_key}: {sub_value}")
119
+ elif isinstance(value, list):
120
+ # Handle lists
121
+ self.console.print(f" {key}:")
122
+ for item in value[:5]: # Limit to first 5 items
123
+ if isinstance(item, dict):
124
+ # Handle dict items in list
125
+ desc = item.get("description") or str(item)
126
+ prefix = "⚠️ " if show_warnings else "•"
127
+ self.console.print(f" {prefix} {desc}")
128
+ else:
129
+ self.console.print(f" • {item}")
130
+ else:
131
+ # Simple key-value
132
+ self.console.print(f" {key}: {value}")
133
+
134
+ def display_recommendations(self, recommendations: List[str]) -> None:
135
+ """Display a recommendations section."""
136
+ if recommendations:
137
+ self.display_section_title("💡 Recommendations")
138
+ for rec in recommendations[:5]:
139
+ self.console.print(f" → {rec}")
140
+
141
+ def display_documentation_status(
142
+ self, analysis: Dict, title: str = "Current CLAUDE.md Status"
143
+ ) -> None:
144
+ """Display documentation status table."""
145
+ data = {
146
+ "Size": analysis.get("size", 0),
147
+ "Lines": analysis.get("lines", 0),
148
+ "Sections": len(analysis.get("sections", [])),
149
+ "Has Priority Index": analysis.get("has_priority_index", False),
150
+ "Has Priority Markers": analysis.get("has_priority_markers", False),
151
+ }
152
+
153
+ if analysis.get("last_modified"):
154
+ data["Last Modified"] = analysis["last_modified"]
155
+
156
+ self.display_key_value_table(title, data)
157
+
158
+ # Display warnings if present
159
+ if analysis.get("outdated_patterns"):
160
+ self.display_warning_list(
161
+ "⚠️ Outdated patterns detected:", analysis["outdated_patterns"]
162
+ )
163
+
164
+ # Display custom sections if present
165
+ if analysis.get("custom_sections"):
166
+ self.display_info_list(
167
+ "[INFO]️ Custom sections found:", analysis["custom_sections"]
168
+ )
169
+
170
+ def display_activity_summary(
171
+ self, summary: Dict, period: str = "Last 30 days"
172
+ ) -> None:
173
+ """Display activity summary metrics."""
174
+ metrics = {
175
+ "Total commits": summary.get("total_commits", 0),
176
+ "Active contributors": summary.get("total_authors", 0),
177
+ "Files modified": summary.get("files_changed", 0),
178
+ "Current branch": summary.get("current_branch", "unknown"),
179
+ }
180
+
181
+ self.display_metrics_section(
182
+ f"📊 Activity Overview ({period.lower()})", metrics
183
+ )
184
+
185
+ if summary.get("has_uncommitted"):
186
+ self.display_metric_row(
187
+ "⚠️ Uncommitted changes",
188
+ f"{summary.get('uncommitted_count', 0)} files",
189
+ warning=True,
190
+ )
191
+
192
+ def display_commit_list(
193
+ self, commits: List[Dict], title: str = "📝 Recent Commits (last 10)"
194
+ ) -> None:
195
+ """Display a list of commits."""
196
+ if commits:
197
+ self.display_section_title(title)
198
+ for commit in commits[:10]:
199
+ msg = commit.get("message", "")[:60]
200
+ hash_val = commit.get("hash", "")
201
+ author = commit.get("author", "")
202
+ self.console.print(f" [{hash_val}] {msg} - {author}")
203
+
204
+ def display_file_change_list(
205
+ self, files: List[Tuple[str, int]], title: str = "🔥 Most Changed Files"
206
+ ) -> None:
207
+ """Display a list of changed files with change counts."""
208
+ if files:
209
+ self.display_section_title(title)
210
+ for file_path, changes in files[:10]:
211
+ self.console.print(f" {file_path}: {changes} changes")
212
+
213
+ def display_branch_list(
214
+ self,
215
+ branches: List[str],
216
+ current_branch: str,
217
+ title: str = "🌿 Active Branches",
218
+ ) -> None:
219
+ """Display a list of branches with current branch marked."""
220
+ if branches:
221
+ self.display_section_title(title)
222
+ for branch in branches:
223
+ marker = "→" if branch == current_branch else " "
224
+ self.console.print(f" {marker} {branch}")
225
+
226
+ def display_success_panel(
227
+ self,
228
+ title: str,
229
+ content: str,
230
+ border_style: str = "green",
231
+ ) -> None:
232
+ """Display a success panel with content."""
233
+ self.console.print(Panel(content, title=title, border_style=border_style))
234
+
235
+ def display_info_panel(
236
+ self,
237
+ title: str,
238
+ content: str,
239
+ border_style: str = "cyan",
240
+ ) -> None:
241
+ """Display an info panel with content."""
242
+ self.console.print(Panel(content, title=title, border_style=border_style))
243
+
244
+ def display_files_list(
245
+ self, title: str, files: List[str], prefix: str = "•"
246
+ ) -> None:
247
+ """Display a list of files."""
248
+ if files:
249
+ self.console.print(f"[bold]{title}[/bold]")
250
+ for file in files:
251
+ self.console.print(f" {prefix} {file}")
252
+ self.console.print()
253
+
254
+ def display_next_steps(self, steps: List[str]) -> None:
255
+ """Display next steps list."""
256
+ if steps:
257
+ self.console.print("[bold]Next Steps:[/bold]")
258
+ for step in steps:
259
+ self.console.print(f" → {step}")
260
+ self.console.print()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-mpm
3
- Version: 4.7.3
3
+ Version: 4.7.5
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
@@ -1,5 +1,5 @@
1
1
  claude_mpm/BUILD_NUMBER,sha256=9JfxhnDtr-8l3kCP2U5TVXSErptHoga8m7XA8zqgGOc,4
2
- claude_mpm/VERSION,sha256=i5wzhntPMY1zms8T1VLFSSgDlf3W5lzl65wykXeMg1Q,6
2
+ claude_mpm/VERSION,sha256=S1_5LwX4BqRmj3UoBp6ODrFMvkFt5xvcn9wfpuFze9Y,6
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=cChN3myrAcF3jC-6DvHnBFTEnwlDk-TAsIXPvUZr_yw,5953
@@ -16,7 +16,7 @@ claude_mpm/agents/BASE_RESEARCH.md,sha256=2DZhDd5XxWWtsyNTBIwvtNWBu1JpFy5R5SAZDH
16
16
  claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md,sha256=zQZhrhVq9NLCtSjVX-aC0xcgueemSuPhKyv0SjEOyIQ,25852
17
17
  claude_mpm/agents/MEMORY.md,sha256=KbRwY_RYdOvTvFC2DD-ATfwjHkQWJ5PIjlGws_7RmjI,3307
18
18
  claude_mpm/agents/OUTPUT_STYLE.md,sha256=IYbo4jmICihrfnChbdrRpwVk4VobCcNyYqZqd53VXMk,533
19
- claude_mpm/agents/PM_INSTRUCTIONS.md,sha256=Gp3vyt8_ufp0tWbiBrpYI4MwucxzedumNRiRyWIekhg,41104
19
+ claude_mpm/agents/PM_INSTRUCTIONS.md,sha256=-FWemY4obkXpmuJ9oUPdqenKhAEjnRV-oIyusVGYnOY,41026
20
20
  claude_mpm/agents/WORKFLOW.md,sha256=vJ9iXCVqAaeM_yVlXxbcP3bsL210-1BI3ZAanvWv4hI,9085
21
21
  claude_mpm/agents/__init__.py,sha256=jRFxvV_DIZ-NdENa-703Xu3YpwvlQj6yv-mQ6FgmldM,3220
22
22
  claude_mpm/agents/agent-template.yaml,sha256=mRlz5Yd0SmknTeoJWgFkZXzEF5T7OmGBJGs2-KPT93k,1969
@@ -45,7 +45,7 @@ claude_mpm/agents/templates/memory_manager.json,sha256=h1DCAn5Wd8TbTzCGjqZ9I8LgG
45
45
  claude_mpm/agents/templates/nextjs_engineer.json,sha256=9m0cT-AKEhMYV0AocRNESrEMg36FIR03RYA1cZOeFTA,19256
46
46
  claude_mpm/agents/templates/ops.json,sha256=z6qQyMOxuMMqL8kL8lsh0BsRa0kLgAozVsz-K6sOmkA,10912
47
47
  claude_mpm/agents/templates/php-engineer.json,sha256=K3VovBySAnUz1yFTU0HHa6ojoPx2ggwAgwNmNdskB7A,20386
48
- claude_mpm/agents/templates/project_organizer.json,sha256=sqGoA0eHSWIrpUskruKFUy0EFvzAOhUrAxPea6C5vLg,5632
48
+ claude_mpm/agents/templates/project_organizer.json,sha256=-u0JqiEjx9igxFbfHWwW8RLvhtPZld6FS2j6Hys9mA8,7314
49
49
  claude_mpm/agents/templates/prompt-engineer.json,sha256=WWBGnJxQPbixNUyDXDxuhaKfZ9KdB8bYwk2tT8HZ4UM,37300
50
50
  claude_mpm/agents/templates/python_engineer.json,sha256=5I3C2JDd6arZ49k70o35JOQIFflgdUyxK1kWMYZiuEs,17880
51
51
  claude_mpm/agents/templates/qa.json,sha256=B_pWrC78G3lOfxmKweOzbdG9fYOG42w6gSJTCkabDQs,10414
@@ -96,8 +96,8 @@ claude_mpm/cli/commands/mcp_setup_external.py,sha256=hfBHkaioNa0JRDhahNEc8agyrUw
96
96
  claude_mpm/cli/commands/mcp_tool_commands.py,sha256=q17GzlFT3JiLTrDqwPO2tz1-fKmPO5QU449syTnKTz4,1283
97
97
  claude_mpm/cli/commands/memory.py,sha256=O4T5HGL-Ob_QPt2dZHQvoOrVohnaDKrBjyngq1Mcv1w,26185
98
98
  claude_mpm/cli/commands/monitor.py,sha256=Fjb68hf3dEwTFek2LV8Nh6iU0qEkY7qYlOn32IwNaNg,9566
99
- claude_mpm/cli/commands/mpm_init.py,sha256=QpkB-gw1nRhHfZn1PfdAS_rL8dFeerq_AGqz0za8Kco,45094
100
- claude_mpm/cli/commands/mpm_init_handler.py,sha256=X7ENga7k2_b3GEJ5obB9LHuxHUEC9F49Ooz7cZCn-dg,3294
99
+ claude_mpm/cli/commands/mpm_init.py,sha256=H7op69CaE7VPOViTuEiCTeANe708ZAcJpkpgbfG2baM,60311
100
+ claude_mpm/cli/commands/mpm_init_handler.py,sha256=b1CSwZYJ89wMorKzPOKS-RVxOKR2kT9yv9KQLvKkd2U,3532
101
101
  claude_mpm/cli/commands/run.py,sha256=PB2H55piOPTy4yo4OBgbUCjMlcz9K79wbwpxQVc9m5Q,48225
102
102
  claude_mpm/cli/commands/search.py,sha256=_0qbUnop8v758MHsB0fAop8FVxwygD59tec_-iN7pLE,9806
103
103
  claude_mpm/cli/commands/tickets.py,sha256=kl2dklTBnG3Y4jUUJ_PcEVsTx4CtVJfkGWboWBx_mQM,21234
@@ -118,7 +118,7 @@ claude_mpm/cli/parsers/debug_parser.py,sha256=F7MZdmiXiPfiIPMv21ZUqB2cMT8Ho1LDmp
118
118
  claude_mpm/cli/parsers/mcp_parser.py,sha256=2j6ULhdu55Z2k_-Gu2QxIsFoTQFbDCEMSGePXSuPoQQ,6532
119
119
  claude_mpm/cli/parsers/memory_parser.py,sha256=ZwCDxJEgp-w03L-1tZsWTgisiwamP42s424bA5bvDJc,4760
120
120
  claude_mpm/cli/parsers/monitor_parser.py,sha256=PeoznSi_5Bw6THK_Espl8M20o6dKvvBSmFzAbovkaFQ,4920
121
- claude_mpm/cli/parsers/mpm_init_parser.py,sha256=js8dmgb4d90-XBg6S7uJEb4cXFMiffUN50TfEi8JOtU,6223
121
+ claude_mpm/cli/parsers/mpm_init_parser.py,sha256=jMV67caBeC-LV-oOuAGJXvFbiBJQ4nGcl6ggfX0_7jI,7662
122
122
  claude_mpm/cli/parsers/run_parser.py,sha256=cs34qNonFZG8uYxTYEt0rXi2LcPz3pw8D8hxiywih6w,4927
123
123
  claude_mpm/cli/parsers/search_parser.py,sha256=L8-65kndg-zutSKpzj-eCvTNkeySCZ-WlSHdhk7pEak,6916
124
124
  claude_mpm/cli/parsers/tickets_parser.py,sha256=FYl-VNH7PrZzfZUCcjnf6F7g6JXnL8YDxwrmR5svIcg,6966
@@ -135,9 +135,10 @@ claude_mpm/commands/__init__.py,sha256=paX5Ub5-UmRgiQ8UgKWIKwU2-RjLu67OmNJND-fVt
135
135
  claude_mpm/commands/mpm-agents.md,sha256=JnYPJ-eWvIEEtiCB6iPu182P2xDBRvU3ArVXQ7h32kU,1341
136
136
  claude_mpm/commands/mpm-config.md,sha256=79Eb-srRpEVV3HCHDHZc8SKec6_LVP6HbXDEVkZKLgw,2929
137
137
  claude_mpm/commands/mpm-doctor.md,sha256=ut5LhFKVRw-2ecjMSPsnaTiRuFXa6Q9t-Wgl3CCnQvk,590
138
- claude_mpm/commands/mpm-help.md,sha256=Dik-wLRNeU2c96L6WXLeAqGsqmv6R5YwoKQLyh6UIP0,2743
139
- claude_mpm/commands/mpm-init.md,sha256=Rpzm_ZnhJ8Q9zD9GQIRHZcU6WhQ0rA7mEPWToWMFTXU,7996
140
- claude_mpm/commands/mpm-organize.md,sha256=JDP32AFX-j8FfsogiPwPiyoTnli6wPClqF3Kj8M6tf0,9167
138
+ claude_mpm/commands/mpm-help.md,sha256=zfhpE0Fd-wW5zWmYYAMRMT-xYK8saqbw-HXRD7csJHI,2850
139
+ claude_mpm/commands/mpm-init.md,sha256=hVVr71X0w67O08B_x9wP2FRijtkLUVIHWDi-0FSBRPA,10291
140
+ claude_mpm/commands/mpm-monitor.md,sha256=onTHf9Yac1KkdZdENtY2Q5jyw0A-vZLYgoKkPCtZLUY,12193
141
+ claude_mpm/commands/mpm-organize.md,sha256=T-ysjhwgfW9irjUj02vuY_1jeMdabO_zxcShyjmqsiM,10153
141
142
  claude_mpm/commands/mpm-status.md,sha256=oaM4ybL4ffp55nkT9F0mp_5H4tF-wX9mbqK-LEKEqUU,1919
142
143
  claude_mpm/commands/mpm-tickets.md,sha256=a2_mW56QDhw7-jMU92ycGaxvSSYpNoQFGhkWbr3MJ88,2356
143
144
  claude_mpm/commands/mpm.md,sha256=tv_Mr6p2olRKIltKui4ljfCNG69VokkyIg951CeMBas,559
@@ -221,8 +222,7 @@ claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css,sha256=
221
222
  claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css,sha256=v6uB3hr2dU7aGodvQVxu1y-bM-pN-jeOD_-iwGG7mIc,603
222
223
  claude_mpm/dashboard/react/components/shared/FilterBar.module.css,sha256=Ea-dpAlKoY7WobxLESQsNvLUVjFhJlQvLygCY8-47Vk,1690
223
224
  claude_mpm/dashboard/static/events.html,sha256=iKBH2gqxhU6JTmSglAVyNJkWA9c11L4Dxn40otAfnAU,17952
224
- claude_mpm/dashboard/static/index.html,sha256=5N7toUxcTQJgqwGPyk8J7kvzR71WCdMpy3F8niM-ZK0,26044
225
- claude_mpm/dashboard/static/monitors-index.html,sha256=T_mVVqXm5STLaFZWH7rFJaiYeG57WKnlNdVYII9nrY0,7232
225
+ claude_mpm/dashboard/static/index.html,sha256=F971Wwl0opHFb-SKD3fi0tvZmrzMPLh7MkJsJzR9tAc,31192
226
226
  claude_mpm/dashboard/static/monitors.html,sha256=waNCJiIGWBvve7nbzvihnVDjaP49FPfFSNqOpkwiIaM,14229
227
227
  claude_mpm/dashboard/static/socket.io.min.js,sha256=c-uha8iV_fpFTifsuA3vMe3o2GH5nhdf-TsRDqvsBE8,49993
228
228
  claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js,sha256=sOc1gU-Nz-zWzbinzpWil6fh5fJyeinm9ZAYAdUvoMU,46831
@@ -283,7 +283,7 @@ claude_mpm/dashboard/static/built/shared/dom-helpers.js,sha256=PXY8iLBJqsWP_NNyF
283
283
  claude_mpm/dashboard/static/built/shared/event-bus.js,sha256=aV2QMt8Ris1BFxuFUYoOvMYXb3M4AmPHsppaBDbbxXo,9906
284
284
  claude_mpm/dashboard/static/built/shared/event-filter-service.js,sha256=DY1rRjGxFcUyAXSPj7hUrQVJ7UpgcGkc6NRZNpFwlq4,16149
285
285
  claude_mpm/dashboard/static/built/shared/logger.js,sha256=nQE-6b8pAAhWsafgon6UT-ueyOmhukrNFaGkcT77RS0,10431
286
- claude_mpm/dashboard/static/built/shared/page-structure.js,sha256=_SEs6D1H0zRLewEUj0uFgbZR80IN5lYdeRYfiMiX_oM,8681
286
+ claude_mpm/dashboard/static/built/shared/page-structure.js,sha256=yRGt_ZWMbDHM2sy_mTW5AhrfH1bPn1GngjALzdakK3g,8515
287
287
  claude_mpm/dashboard/static/built/shared/tooltip-service.js,sha256=T0_0koY2SNHTlctzU4Z5VBH0EWRXmO-ODo9WvO2HUto,7588
288
288
  claude_mpm/dashboard/static/css/activity.css,sha256=0SJUwGB6fr4OlVqMwhvVKrPndg2R3QTZPnN6DkAo4aU,37987
289
289
  claude_mpm/dashboard/static/css/code-tree.css,sha256=Sx74ilt7exGOdxCBEtjP9gZ74lB5e8QWr3_SIcl_0hw,30708
@@ -355,7 +355,7 @@ claude_mpm/dashboard/static/legacy/agents.html,sha256=9o1BfJSwSett1adw4ljJ704Pd8
355
355
  claude_mpm/dashboard/static/legacy/files.html,sha256=9lopC78Ah5Ott47N-fU_HRMWdSbWIVto3xvQnLNqxfs,24916
356
356
  claude_mpm/dashboard/static/legacy/tools.html,sha256=6YuAJ3Ggmtp4ysKDxhSbqk1D4ayIHc5o-GgF1o0YFP8,28401
357
357
  claude_mpm/dashboard/static/production/events.html,sha256=lEcviOUjOhgaY0znGpjdKJjNyVrriWEJ3GNO-GANpn8,19457
358
- claude_mpm/dashboard/static/production/main.html,sha256=u-l7YqIQK8JtVoynRquyd3lSbGv-zMLP-rkTFlE9Lw4,34294
358
+ claude_mpm/dashboard/static/production/main.html,sha256=p2nS9r8nky3ngh-zutqQxsktJEbF2NnlIrI7UKU8bUc,33367
359
359
  claude_mpm/dashboard/static/production/monitors.html,sha256=9FA-cNbS1-eKsPwvInq3SjpVRWKatXUar-VUnfSXTRo,15732
360
360
  claude_mpm/dashboard/static/test-archive/dashboard.html,sha256=F971Wwl0opHFb-SKD3fi0tvZmrzMPLh7MkJsJzR9tAc,31192
361
361
  claude_mpm/dashboard/static/test-archive/debug-events.html,sha256=fpAKX6vnSzxefP0y0SkwHaEnve04-rZy2HfxstJslNA,4755
@@ -363,7 +363,7 @@ claude_mpm/dashboard/static/test-archive/test-navigation.html,sha256=vVdEjz_EGhN
363
363
  claude_mpm/dashboard/static/test-archive/test-react-exports.html,sha256=lqMHNjEce0Ddgt7LPuVyCiqLUYCvPwAgu6oVCqf3sek,6464
364
364
  claude_mpm/dashboard/static/test-archive/test_debug.html,sha256=XZ0tcKA57VnlE_OLGusb0UWh8Hs4SgeD-wsc4neh8Zw,815
365
365
  claude_mpm/dashboard/templates/code_simple.html,sha256=xrmTLFow0M5NWFlk4ci1eLWML-IHr35i5pqIVaEg2TU,4329
366
- claude_mpm/dashboard/templates/index.html,sha256=oqB2_i0ezheBbGGR_mj61U0KyinXYFyuvkKQBwz9HZ8,32736
366
+ claude_mpm/dashboard/templates/index.html,sha256=0YjuhXGrqs4yz5ZPwsNQ1sKRUp4l3dChm6ejMLGw5Vk,31809
367
367
  claude_mpm/experimental/__init__.py,sha256=R_aclOvWpvSTHWAx9QXyg9OIPVK2dXT5tQJhxLQN11Y,369
368
368
  claude_mpm/experimental/cli_enhancements.py,sha256=PfAt-SI-crBoE0Dtx1JecpS5_6OT_0apJbo28KS6HUI,11541
369
369
  claude_mpm/generators/__init__.py,sha256=rG8vwF_BjPmeMKvyMXpUA8uJ-7mtW2HTNfalZzgRlNk,153
@@ -678,7 +678,7 @@ claude_mpm/services/project/architecture_analyzer.py,sha256=YpGDIk_yGM-vkGcnBo27
678
678
  claude_mpm/services/project/archive_manager.py,sha256=jksVgx7q7V675QEs3GzECYeb0lTphvtP2UeEZuubVMQ,39236
679
679
  claude_mpm/services/project/dependency_analyzer.py,sha256=CQGQgFSdozSE7gl2DD0Q9MLLtyzA99ntKRrCGywZhuQ,15621
680
680
  claude_mpm/services/project/documentation_manager.py,sha256=d50_vnG2Q8F2Bld5nivdPSm5zXVFKebHfTASHL1hevI,19118
681
- claude_mpm/services/project/enhanced_analyzer.py,sha256=IKlXRTIZYDYZKHwK6QWxMqpYhng3nd8UsRLcMcvfJcc,18764
681
+ claude_mpm/services/project/enhanced_analyzer.py,sha256=IE12g4ykXLkanyROOcztBs8gGq5UMNkI0yAolCkAhtA,19759
682
682
  claude_mpm/services/project/language_analyzer.py,sha256=KnbwHLtUcnzdMY6bseZk90bMo0yI9n_pXP5Mj4tLDgg,9209
683
683
  claude_mpm/services/project/metrics_collector.py,sha256=ctXgu-qWVZoKAJ2IC0tZ0lSuS7nfN0beZgTvcEomN70,12929
684
684
  claude_mpm/services/project/project_organizer.py,sha256=9uAHI5MISum7YKNibRwH2jxbFmUUUEAbzR5YxX60Gyo,37611
@@ -769,6 +769,7 @@ claude_mpm/utils/database_connector.py,sha256=7Fa9gzr19Y-5eJuvCGfBYJRjMfI6s-EIB6
769
769
  claude_mpm/utils/dependency_cache.py,sha256=GmdSYmV6YSmvtaoeAR2vGZpD3ormFsHpooKJqYgOZa0,11780
770
770
  claude_mpm/utils/dependency_manager.py,sha256=g9iYA_uyZ4XE8cY-VfhKYd1NA3aqr9ZYT3IBTv_abmY,7356
771
771
  claude_mpm/utils/dependency_strategies.py,sha256=m-VyZP0KF8z1mCcd_dEPNZ8WbU8z0GyBpvw210yCNvM,12149
772
+ claude_mpm/utils/display_helper.py,sha256=Ce2TGGOqMLq3o7L5ax9YtxNaFuNisLb97Cdoe4Y5Gjs,9783
772
773
  claude_mpm/utils/environment_context.py,sha256=mCnRJqQLTyaAv-7M4bp9N9WqVgfSQb5xbbfgvFxGHJA,10141
773
774
  claude_mpm/utils/error_handler.py,sha256=RWL7DnXttJKCgYhevUm9XlMC33rEhX2CXo1IiCtwV4g,7969
774
775
  claude_mpm/utils/file_utils.py,sha256=pv3MEKLsn4WIOra5JoHnCm_FaJbNcKMuS3EKuXAWyLc,7859
@@ -783,9 +784,9 @@ claude_mpm/utils/subprocess_utils.py,sha256=D0izRT8anjiUb_JG72zlJR_JAw1cDkb7kalN
783
784
  claude_mpm/validation/__init__.py,sha256=YZhwE3mhit-lslvRLuwfX82xJ_k4haZeKmh4IWaVwtk,156
784
785
  claude_mpm/validation/agent_validator.py,sha256=GprtAvu80VyMXcKGsK_VhYiXWA6BjKHv7O6HKx0AB9w,20917
785
786
  claude_mpm/validation/frontmatter_validator.py,sha256=YpJlYNNYcV8u6hIOi3_jaRsDnzhbcQpjCBE6eyBKaFY,7076
786
- claude_mpm-4.7.3.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
787
- claude_mpm-4.7.3.dist-info/METADATA,sha256=iAW3vLlCDS6H2eagLtPZ-JAsidq9Sv-BCd-3Ls3x8GU,17517
788
- claude_mpm-4.7.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
789
- claude_mpm-4.7.3.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
790
- claude_mpm-4.7.3.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
791
- claude_mpm-4.7.3.dist-info/RECORD,,
787
+ claude_mpm-4.7.5.dist-info/licenses/LICENSE,sha256=lpaivOlPuBZW1ds05uQLJJswy8Rp_HMNieJEbFlqvLk,1072
788
+ claude_mpm-4.7.5.dist-info/METADATA,sha256=hq04JsKoSrZIIOVtawIlwapyPzZOkFxDl2BhsNcOFR0,17517
789
+ claude_mpm-4.7.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
790
+ claude_mpm-4.7.5.dist-info/entry_points.txt,sha256=Vlw3GNi-OtTpKSrez04iNrPmxNxYDpIWxmJCxiZ5Tx8,526
791
+ claude_mpm-4.7.5.dist-info/top_level.txt,sha256=1nUg3FEaBySgm8t-s54jK5zoPnu3_eY6EP6IOlekyHA,11
792
+ claude_mpm-4.7.5.dist-info/RECORD,,