claude-mpm 4.15.3__py3-none-any.whl → 4.15.6__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/templates/agentic-coder-optimizer.json +9 -2
- claude_mpm/agents/templates/api_qa.json +7 -1
- claude_mpm/agents/templates/clerk-ops.json +8 -1
- claude_mpm/agents/templates/code_analyzer.json +4 -1
- claude_mpm/agents/templates/dart_engineer.json +11 -1
- claude_mpm/agents/templates/data_engineer.json +11 -1
- claude_mpm/agents/templates/documentation.json +6 -1
- claude_mpm/agents/templates/engineer.json +13 -0
- claude_mpm/agents/templates/gcp_ops_agent.json +8 -1
- claude_mpm/agents/templates/golang_engineer.json +11 -1
- claude_mpm/agents/templates/java_engineer.json +12 -2
- claude_mpm/agents/templates/local_ops_agent.json +216 -37
- claude_mpm/agents/templates/nextjs_engineer.json +11 -1
- claude_mpm/agents/templates/ops.json +8 -1
- claude_mpm/agents/templates/php-engineer.json +11 -1
- claude_mpm/agents/templates/project_organizer.json +9 -2
- claude_mpm/agents/templates/prompt-engineer.json +5 -1
- claude_mpm/agents/templates/python_engineer.json +11 -1
- claude_mpm/agents/templates/qa.json +7 -1
- claude_mpm/agents/templates/react_engineer.json +11 -1
- claude_mpm/agents/templates/refactoring_engineer.json +8 -1
- claude_mpm/agents/templates/research.json +4 -1
- claude_mpm/agents/templates/ruby-engineer.json +11 -1
- claude_mpm/agents/templates/rust_engineer.json +11 -1
- claude_mpm/agents/templates/security.json +6 -1
- claude_mpm/agents/templates/ticketing.json +6 -1
- claude_mpm/agents/templates/typescript_engineer.json +11 -1
- claude_mpm/agents/templates/vercel_ops_agent.json +8 -1
- claude_mpm/agents/templates/version_control.json +8 -1
- claude_mpm/agents/templates/web_qa.json +7 -1
- claude_mpm/agents/templates/web_ui.json +11 -1
- claude_mpm/cli/commands/configure.py +164 -16
- claude_mpm/cli/commands/configure_agent_display.py +6 -6
- claude_mpm/cli/commands/configure_behavior_manager.py +8 -8
- claude_mpm/cli/commands/configure_navigation.py +20 -18
- claude_mpm/cli/commands/configure_startup_manager.py +14 -14
- claude_mpm/cli/commands/configure_template_editor.py +8 -8
- claude_mpm/cli/interactive/__init__.py +3 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/startup.py +26 -0
- claude_mpm/dashboard/static/js/dashboard.js +0 -14
- claude_mpm/dashboard/templates/index.html +3 -41
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/hook.py +10 -0
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/server/main.py +7 -7
- claude_mpm/skills/__init__.py +21 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/registry.py +198 -0
- claude_mpm/skills/skill_manager.py +310 -0
- {claude_mpm-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/METADATA +1 -1
- {claude_mpm-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/RECORD +57 -72
- claude_mpm/dashboard/static/css/code-tree.css +0 -1639
- claude_mpm/dashboard/static/js/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/js/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/js/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/js/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -5869
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -1386
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.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__/installer.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/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.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-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/WHEEL +0 -0
- {claude_mpm-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/top_level.txt +0 -0
|
@@ -175,5 +175,15 @@
|
|
|
175
175
|
"token_usage": 10240,
|
|
176
176
|
"success_rate": 0.95
|
|
177
177
|
}
|
|
178
|
-
}
|
|
178
|
+
},
|
|
179
|
+
"skills": [
|
|
180
|
+
"test-driven-development",
|
|
181
|
+
"systematic-debugging",
|
|
182
|
+
"async-testing",
|
|
183
|
+
"performance-profiling",
|
|
184
|
+
"security-scanning",
|
|
185
|
+
"code-review",
|
|
186
|
+
"refactoring-patterns",
|
|
187
|
+
"git-workflow"
|
|
188
|
+
]
|
|
179
189
|
}
|
|
@@ -211,19 +211,21 @@ class ConfigureCommand(BaseCommand):
|
|
|
211
211
|
if choice == "1":
|
|
212
212
|
self._manage_agents()
|
|
213
213
|
elif choice == "2":
|
|
214
|
-
self.
|
|
214
|
+
self._manage_skills()
|
|
215
215
|
elif choice == "3":
|
|
216
|
-
self.
|
|
216
|
+
self._edit_templates()
|
|
217
217
|
elif choice == "4":
|
|
218
|
+
self._manage_behaviors()
|
|
219
|
+
elif choice == "5":
|
|
218
220
|
# If user saves and wants to proceed to startup, exit the configurator
|
|
219
221
|
if self._manage_startup_configuration():
|
|
220
222
|
self.console.print(
|
|
221
223
|
"\n[green]Configuration saved. Exiting configurator...[/green]"
|
|
222
224
|
)
|
|
223
225
|
break
|
|
224
|
-
elif choice == "5":
|
|
225
|
-
self._switch_scope()
|
|
226
226
|
elif choice == "6":
|
|
227
|
+
self._switch_scope()
|
|
228
|
+
elif choice == "7":
|
|
227
229
|
self._show_version_info_interactive()
|
|
228
230
|
elif choice == "l":
|
|
229
231
|
# Check for pending agent changes
|
|
@@ -296,33 +298,33 @@ class ConfigureCommand(BaseCommand):
|
|
|
296
298
|
|
|
297
299
|
# Use Text objects to properly display shortcuts with styling
|
|
298
300
|
text_t = Text(" ")
|
|
299
|
-
text_t.append("[t]", style="
|
|
301
|
+
text_t.append("[t]", style="bold blue")
|
|
300
302
|
text_t.append(" Toggle agents (enable/disable multiple)")
|
|
301
303
|
self.console.print(text_t)
|
|
302
304
|
|
|
303
305
|
text_c = Text(" ")
|
|
304
|
-
text_c.append("[c]", style="
|
|
306
|
+
text_c.append("[c]", style="bold blue")
|
|
305
307
|
text_c.append(" Customize agent template")
|
|
306
308
|
self.console.print(text_c)
|
|
307
309
|
|
|
308
310
|
text_v = Text(" ")
|
|
309
|
-
text_v.append("[v]", style="
|
|
311
|
+
text_v.append("[v]", style="bold blue")
|
|
310
312
|
text_v.append(" View agent details")
|
|
311
313
|
self.console.print(text_v)
|
|
312
314
|
|
|
313
315
|
text_r = Text(" ")
|
|
314
|
-
text_r.append("[r]", style="
|
|
316
|
+
text_r.append("[r]", style="bold blue")
|
|
315
317
|
text_r.append(" Reset agent to defaults")
|
|
316
318
|
self.console.print(text_r)
|
|
317
319
|
|
|
318
320
|
text_b = Text(" ")
|
|
319
|
-
text_b.append("[b]", style="
|
|
321
|
+
text_b.append("[b]", style="bold blue")
|
|
320
322
|
text_b.append(" Back to main menu")
|
|
321
323
|
self.console.print(text_b)
|
|
322
324
|
|
|
323
325
|
self.console.print()
|
|
324
326
|
|
|
325
|
-
choice = Prompt.ask("[bold
|
|
327
|
+
choice = Prompt.ask("[bold blue]Select an option[/bold blue]", default="b")
|
|
326
328
|
|
|
327
329
|
if choice == "b":
|
|
328
330
|
break
|
|
@@ -361,32 +363,32 @@ class ConfigureCommand(BaseCommand):
|
|
|
361
363
|
# Show menu
|
|
362
364
|
self.console.print("\n[bold]Toggle Agent Status:[/bold]")
|
|
363
365
|
text_toggle = Text(" ")
|
|
364
|
-
text_toggle.append("[t]", style="
|
|
366
|
+
text_toggle.append("[t]", style="bold blue")
|
|
365
367
|
text_toggle.append(" Enter agent IDs to toggle (e.g., '1,3,5' or '1-4')")
|
|
366
368
|
self.console.print(text_toggle)
|
|
367
369
|
|
|
368
370
|
text_all = Text(" ")
|
|
369
|
-
text_all.append("[a]", style="
|
|
371
|
+
text_all.append("[a]", style="bold blue")
|
|
370
372
|
text_all.append(" Enable all agents")
|
|
371
373
|
self.console.print(text_all)
|
|
372
374
|
|
|
373
375
|
text_none = Text(" ")
|
|
374
|
-
text_none.append("[n]", style="
|
|
376
|
+
text_none.append("[n]", style="bold blue")
|
|
375
377
|
text_none.append(" Disable all agents")
|
|
376
378
|
self.console.print(text_none)
|
|
377
379
|
|
|
378
380
|
text_save = Text(" ")
|
|
379
|
-
text_save.append("[s]", style="green
|
|
381
|
+
text_save.append("[s]", style="bold green")
|
|
380
382
|
text_save.append(" Save changes and return")
|
|
381
383
|
self.console.print(text_save)
|
|
382
384
|
|
|
383
385
|
text_cancel = Text(" ")
|
|
384
|
-
text_cancel.append("[c]", style="
|
|
386
|
+
text_cancel.append("[c]", style="bold magenta")
|
|
385
387
|
text_cancel.append(" Cancel (discard changes)")
|
|
386
388
|
self.console.print(text_cancel)
|
|
387
389
|
|
|
388
390
|
choice = (
|
|
389
|
-
Prompt.ask("[bold
|
|
391
|
+
Prompt.ask("[bold blue]Select an option[/bold blue]", default="s")
|
|
390
392
|
.strip()
|
|
391
393
|
.lower()
|
|
392
394
|
)
|
|
@@ -473,6 +475,152 @@ class ConfigureCommand(BaseCommand):
|
|
|
473
475
|
# to accept a header callback in the future. For now, just delegate.
|
|
474
476
|
self.behavior_manager.manage_behaviors()
|
|
475
477
|
|
|
478
|
+
def _manage_skills(self) -> None:
|
|
479
|
+
"""Skills management interface."""
|
|
480
|
+
from ...cli.interactive.skills_wizard import SkillsWizard
|
|
481
|
+
from ...skills.skill_manager import get_manager
|
|
482
|
+
|
|
483
|
+
wizard = SkillsWizard()
|
|
484
|
+
manager = get_manager()
|
|
485
|
+
|
|
486
|
+
while True:
|
|
487
|
+
self.console.clear()
|
|
488
|
+
self._display_header()
|
|
489
|
+
|
|
490
|
+
self.console.print("\n[bold]Skills Management Options:[/bold]\n")
|
|
491
|
+
self.console.print(" [1] View Available Skills")
|
|
492
|
+
self.console.print(" [2] Configure Skills for Agents")
|
|
493
|
+
self.console.print(" [3] View Current Skill Mappings")
|
|
494
|
+
self.console.print(" [4] Auto-Link Skills to Agents")
|
|
495
|
+
self.console.print(" [b] Back to Main Menu")
|
|
496
|
+
self.console.print()
|
|
497
|
+
|
|
498
|
+
choice = Prompt.ask("[bold blue]Select an option[/bold blue]", default="b")
|
|
499
|
+
|
|
500
|
+
if choice == "1":
|
|
501
|
+
# View available skills
|
|
502
|
+
self.console.clear()
|
|
503
|
+
self._display_header()
|
|
504
|
+
wizard.list_available_skills()
|
|
505
|
+
Prompt.ask("\nPress Enter to continue")
|
|
506
|
+
|
|
507
|
+
elif choice == "2":
|
|
508
|
+
# Configure skills interactively
|
|
509
|
+
self.console.clear()
|
|
510
|
+
self._display_header()
|
|
511
|
+
|
|
512
|
+
# Get list of enabled agents
|
|
513
|
+
agents = self.agent_manager.discover_agents()
|
|
514
|
+
enabled_agents = [
|
|
515
|
+
a.name
|
|
516
|
+
for a in agents
|
|
517
|
+
if self.agent_manager.get_pending_state(a.name)
|
|
518
|
+
]
|
|
519
|
+
|
|
520
|
+
if not enabled_agents:
|
|
521
|
+
self.console.print(
|
|
522
|
+
"[yellow]No agents are currently enabled.[/yellow]"
|
|
523
|
+
)
|
|
524
|
+
self.console.print(
|
|
525
|
+
"Please enable agents first in Agent Management."
|
|
526
|
+
)
|
|
527
|
+
Prompt.ask("\nPress Enter to continue")
|
|
528
|
+
continue
|
|
529
|
+
|
|
530
|
+
# Run skills wizard
|
|
531
|
+
success, mapping = wizard.run_interactive_selection(enabled_agents)
|
|
532
|
+
|
|
533
|
+
if success:
|
|
534
|
+
# Save the configuration
|
|
535
|
+
manager.save_mappings_to_config()
|
|
536
|
+
self.console.print("\n[green]✓ Skills configuration saved![/green]")
|
|
537
|
+
else:
|
|
538
|
+
self.console.print(
|
|
539
|
+
"\n[yellow]Skills configuration cancelled.[/yellow]"
|
|
540
|
+
)
|
|
541
|
+
|
|
542
|
+
Prompt.ask("\nPress Enter to continue")
|
|
543
|
+
|
|
544
|
+
elif choice == "3":
|
|
545
|
+
# View current mappings
|
|
546
|
+
self.console.clear()
|
|
547
|
+
self._display_header()
|
|
548
|
+
|
|
549
|
+
self.console.print("\n[bold]Current Skill Mappings:[/bold]\n")
|
|
550
|
+
|
|
551
|
+
mappings = manager.list_agent_skill_mappings()
|
|
552
|
+
if not mappings:
|
|
553
|
+
self.console.print("[dim]No skill mappings configured yet.[/dim]")
|
|
554
|
+
else:
|
|
555
|
+
from rich.table import Table
|
|
556
|
+
|
|
557
|
+
table = Table(show_header=True, header_style="bold cyan")
|
|
558
|
+
table.add_column("Agent", style="yellow")
|
|
559
|
+
table.add_column("Skills", style="green")
|
|
560
|
+
|
|
561
|
+
for agent_id, skills in mappings.items():
|
|
562
|
+
skills_str = (
|
|
563
|
+
", ".join(skills) if skills else "[dim](none)[/dim]"
|
|
564
|
+
)
|
|
565
|
+
table.add_row(agent_id, skills_str)
|
|
566
|
+
|
|
567
|
+
self.console.print(table)
|
|
568
|
+
|
|
569
|
+
Prompt.ask("\nPress Enter to continue")
|
|
570
|
+
|
|
571
|
+
elif choice == "4":
|
|
572
|
+
# Auto-link skills
|
|
573
|
+
self.console.clear()
|
|
574
|
+
self._display_header()
|
|
575
|
+
|
|
576
|
+
self.console.print("\n[bold]Auto-Linking Skills to Agents...[/bold]\n")
|
|
577
|
+
|
|
578
|
+
# Get enabled agents
|
|
579
|
+
agents = self.agent_manager.discover_agents()
|
|
580
|
+
enabled_agents = [
|
|
581
|
+
a.name
|
|
582
|
+
for a in agents
|
|
583
|
+
if self.agent_manager.get_pending_state(a.name)
|
|
584
|
+
]
|
|
585
|
+
|
|
586
|
+
if not enabled_agents:
|
|
587
|
+
self.console.print(
|
|
588
|
+
"[yellow]No agents are currently enabled.[/yellow]"
|
|
589
|
+
)
|
|
590
|
+
self.console.print(
|
|
591
|
+
"Please enable agents first in Agent Management."
|
|
592
|
+
)
|
|
593
|
+
Prompt.ask("\nPress Enter to continue")
|
|
594
|
+
continue
|
|
595
|
+
|
|
596
|
+
# Auto-link
|
|
597
|
+
mapping = wizard._auto_link_skills(enabled_agents)
|
|
598
|
+
|
|
599
|
+
# Display preview
|
|
600
|
+
self.console.print("Auto-linked skills:\n")
|
|
601
|
+
for agent_id, skills in mapping.items():
|
|
602
|
+
self.console.print(f" [yellow]{agent_id}[/yellow]:")
|
|
603
|
+
for skill in skills:
|
|
604
|
+
self.console.print(f" - {skill}")
|
|
605
|
+
|
|
606
|
+
# Confirm
|
|
607
|
+
confirm = Confirm.ask("\nApply this configuration?", default=True)
|
|
608
|
+
|
|
609
|
+
if confirm:
|
|
610
|
+
wizard._apply_skills_configuration(mapping)
|
|
611
|
+
manager.save_mappings_to_config()
|
|
612
|
+
self.console.print("\n[green]✓ Auto-linking complete![/green]")
|
|
613
|
+
else:
|
|
614
|
+
self.console.print("\n[yellow]Auto-linking cancelled.[/yellow]")
|
|
615
|
+
|
|
616
|
+
Prompt.ask("\nPress Enter to continue")
|
|
617
|
+
|
|
618
|
+
elif choice == "b":
|
|
619
|
+
break
|
|
620
|
+
else:
|
|
621
|
+
self.console.print("[red]Invalid choice. Please try again.[/red]")
|
|
622
|
+
Prompt.ask("\nPress Enter to continue")
|
|
623
|
+
|
|
476
624
|
def _display_behavior_files(self) -> None:
|
|
477
625
|
"""Display current behavior files."""
|
|
478
626
|
self.behavior_manager.display_behavior_files()
|
|
@@ -72,9 +72,9 @@ class AgentDisplay:
|
|
|
72
72
|
)
|
|
73
73
|
|
|
74
74
|
table.add_column("ID", style="dim", width=3)
|
|
75
|
-
table.add_column("Name", style="
|
|
75
|
+
table.add_column("Name", style="bold blue", width=22)
|
|
76
76
|
table.add_column("Status", width=12)
|
|
77
|
-
table.add_column("Description", style="bold
|
|
77
|
+
table.add_column("Description", style="bold", width=45)
|
|
78
78
|
table.add_column("Model/Tools", style="dim", width=20)
|
|
79
79
|
|
|
80
80
|
for idx, agent in enumerate(agents, 1):
|
|
@@ -135,10 +135,10 @@ class AgentDisplay:
|
|
|
135
135
|
title += f" [yellow]({pending_count} change{'s' if pending_count != 1 else ''} pending)[/yellow]"
|
|
136
136
|
|
|
137
137
|
table = Table(title=title, box=ROUNDED, show_lines=True, expand=True)
|
|
138
|
-
table.add_column("ID", justify="right", style="
|
|
138
|
+
table.add_column("ID", justify="right", style="bold blue", width=5)
|
|
139
139
|
table.add_column("Name", style="bold", width=22)
|
|
140
140
|
table.add_column("Status", width=20)
|
|
141
|
-
table.add_column("Description", style="bold
|
|
141
|
+
table.add_column("Description", style="bold", width=45)
|
|
142
142
|
|
|
143
143
|
for idx, agent in enumerate(agents, 1):
|
|
144
144
|
current_state = self.agent_manager.is_agent_enabled(agent.name)
|
|
@@ -164,7 +164,7 @@ class AgentDisplay:
|
|
|
164
164
|
if len(agent.description) > 42
|
|
165
165
|
else agent.description
|
|
166
166
|
),
|
|
167
|
-
style="
|
|
167
|
+
style="",
|
|
168
168
|
)
|
|
169
169
|
|
|
170
170
|
table.add_row(str(idx), agent.name, status, desc_display)
|
|
@@ -247,7 +247,7 @@ class AgentDisplay:
|
|
|
247
247
|
detail_text.strip(),
|
|
248
248
|
title=f"[bold]{agent.name} Details[/bold]",
|
|
249
249
|
box=ROUNDED,
|
|
250
|
-
style="
|
|
250
|
+
style="blue",
|
|
251
251
|
)
|
|
252
252
|
|
|
253
253
|
self.console.print(panel)
|
|
@@ -69,33 +69,33 @@ class BehaviorManager:
|
|
|
69
69
|
self.console.print("\n[bold]Options:[/bold]")
|
|
70
70
|
|
|
71
71
|
text_1 = Text(" ")
|
|
72
|
-
text_1.append("[1]", style="
|
|
72
|
+
text_1.append("[1]", style="bold blue")
|
|
73
73
|
text_1.append(" Edit identity configuration")
|
|
74
74
|
self.console.print(text_1)
|
|
75
75
|
|
|
76
76
|
text_2 = Text(" ")
|
|
77
|
-
text_2.append("[2]", style="
|
|
77
|
+
text_2.append("[2]", style="bold blue")
|
|
78
78
|
text_2.append(" Edit workflow configuration")
|
|
79
79
|
self.console.print(text_2)
|
|
80
80
|
|
|
81
81
|
text_3 = Text(" ")
|
|
82
|
-
text_3.append("[3]", style="
|
|
82
|
+
text_3.append("[3]", style="bold blue")
|
|
83
83
|
text_3.append(" Import behavior file")
|
|
84
84
|
self.console.print(text_3)
|
|
85
85
|
|
|
86
86
|
text_4 = Text(" ")
|
|
87
|
-
text_4.append("[4]", style="
|
|
87
|
+
text_4.append("[4]", style="bold blue")
|
|
88
88
|
text_4.append(" Export behavior file")
|
|
89
89
|
self.console.print(text_4)
|
|
90
90
|
|
|
91
91
|
text_b = Text(" ")
|
|
92
|
-
text_b.append("[b]", style="
|
|
92
|
+
text_b.append("[b]", style="bold blue")
|
|
93
93
|
text_b.append(" Back to main menu")
|
|
94
94
|
self.console.print(text_b)
|
|
95
95
|
|
|
96
96
|
self.console.print()
|
|
97
97
|
|
|
98
|
-
choice = Prompt.ask("[bold
|
|
98
|
+
choice = Prompt.ask("[bold blue]Select an option[/bold blue]", default="b")
|
|
99
99
|
|
|
100
100
|
if choice == "b":
|
|
101
101
|
break
|
|
@@ -117,9 +117,9 @@ class BehaviorManager:
|
|
|
117
117
|
Extracted from ConfigureCommand._display_behavior_files()
|
|
118
118
|
"""
|
|
119
119
|
table = Table(title="Behavior Files", box=ROUNDED)
|
|
120
|
-
table.add_column("File", style="
|
|
120
|
+
table.add_column("File", style="bold blue", width=30)
|
|
121
121
|
table.add_column("Size", style="dim", width=10)
|
|
122
|
-
table.add_column("Modified", style="
|
|
122
|
+
table.add_column("Modified", style="", width=20)
|
|
123
123
|
|
|
124
124
|
identity_file = self.behaviors_dir / "identity.yaml"
|
|
125
125
|
workflow_file = self.behaviors_dir / "workflow.yaml"
|
|
@@ -59,11 +59,11 @@ class ConfigNavigation:
|
|
|
59
59
|
|
|
60
60
|
# Create header panel
|
|
61
61
|
header_text = Text()
|
|
62
|
-
header_text.append("Claude MPM ", style="bold
|
|
63
|
-
header_text.append("Configuration Interface", style="bold
|
|
64
|
-
header_text.append(f"\nv{__version__}", style="dim
|
|
62
|
+
header_text.append("Claude MPM ", style="bold blue")
|
|
63
|
+
header_text.append("Configuration Interface", style="bold")
|
|
64
|
+
header_text.append(f"\nv{__version__}", style="dim blue")
|
|
65
65
|
|
|
66
|
-
scope_text = Text(f"Scope: {self.current_scope.upper()}", style="
|
|
66
|
+
scope_text = Text(f"Scope: {self.current_scope.upper()}", style="bold blue")
|
|
67
67
|
dir_text = Text(f"Directory: {self.project_dir}", style="dim")
|
|
68
68
|
|
|
69
69
|
header_content = Columns([header_text], align="center")
|
|
@@ -85,11 +85,12 @@ class ConfigNavigation:
|
|
|
85
85
|
|
|
86
86
|
Displays main configuration menu with options:
|
|
87
87
|
1. Agent Management
|
|
88
|
-
2.
|
|
89
|
-
3.
|
|
90
|
-
4.
|
|
91
|
-
5.
|
|
92
|
-
6.
|
|
88
|
+
2. Skills Management
|
|
89
|
+
3. Template Editing
|
|
90
|
+
4. Behavior Files
|
|
91
|
+
5. Startup Configuration
|
|
92
|
+
6. Switch Scope
|
|
93
|
+
7. Version Info
|
|
93
94
|
l. Save & Launch
|
|
94
95
|
q. Quit
|
|
95
96
|
|
|
@@ -98,23 +99,24 @@ class ConfigNavigation:
|
|
|
98
99
|
"""
|
|
99
100
|
menu_items = [
|
|
100
101
|
("1", "Agent Management", "Enable/disable agents and customize settings"),
|
|
101
|
-
("2", "
|
|
102
|
-
("3", "
|
|
102
|
+
("2", "Skills Management", "Configure skills for agents"),
|
|
103
|
+
("3", "Template Editing", "Edit agent JSON templates"),
|
|
104
|
+
("4", "Behavior Files", "Manage identity and workflow configurations"),
|
|
103
105
|
(
|
|
104
|
-
"
|
|
106
|
+
"5",
|
|
105
107
|
"Startup Configuration",
|
|
106
108
|
"Configure MCP services and agents to start",
|
|
107
109
|
),
|
|
108
|
-
("
|
|
109
|
-
("
|
|
110
|
+
("6", "Switch Scope", f"Current: {self.current_scope}"),
|
|
111
|
+
("7", "Version Info", "Display MPM and Claude versions"),
|
|
110
112
|
("l", "Save & Launch", "Save all changes and start Claude MPM"),
|
|
111
113
|
("q", "Quit", "Exit without launching"),
|
|
112
114
|
]
|
|
113
115
|
|
|
114
116
|
table = Table(show_header=False, box=None, padding=(0, 2))
|
|
115
|
-
table.add_column("Key", style="
|
|
116
|
-
table.add_column("Option", style="bold
|
|
117
|
-
table.add_column("Description", style="
|
|
117
|
+
table.add_column("Key", style="bold blue", width=4) # Bolder shortcuts
|
|
118
|
+
table.add_column("Option", style="bold", width=24) # Wider for titles
|
|
119
|
+
table.add_column("Description", style="") # Use default terminal color
|
|
118
120
|
|
|
119
121
|
for key, option, desc in menu_items:
|
|
120
122
|
table.add_row(f"\\[{key}]", option, desc)
|
|
@@ -126,7 +128,7 @@ class ConfigNavigation:
|
|
|
126
128
|
self.console.print(menu_panel)
|
|
127
129
|
self.console.print()
|
|
128
130
|
|
|
129
|
-
choice = Prompt.ask("[bold
|
|
131
|
+
choice = Prompt.ask("[bold blue]Select an option[/bold blue]", default="q")
|
|
130
132
|
# Strip whitespace to handle leading/trailing spaces
|
|
131
133
|
return choice.strip().lower()
|
|
132
134
|
|
|
@@ -178,8 +178,8 @@ class StartupManager:
|
|
|
178
178
|
title="Current Startup Configuration", box=ROUNDED, show_lines=True
|
|
179
179
|
)
|
|
180
180
|
|
|
181
|
-
table.add_column("Category", style="
|
|
182
|
-
table.add_column("Enabled Services", style="
|
|
181
|
+
table.add_column("Category", style="bold blue", width=20)
|
|
182
|
+
table.add_column("Enabled Services", style="", width=50)
|
|
183
183
|
table.add_column("Count", style="dim", width=10)
|
|
184
184
|
|
|
185
185
|
# MCP Services
|
|
@@ -236,9 +236,9 @@ class StartupManager:
|
|
|
236
236
|
# Display services with checkboxes
|
|
237
237
|
table = Table(box=ROUNDED, show_lines=True)
|
|
238
238
|
table.add_column("ID", style="dim", width=5)
|
|
239
|
-
table.add_column("Service", style="
|
|
239
|
+
table.add_column("Service", style="bold blue", width=25)
|
|
240
240
|
table.add_column("Status", width=15)
|
|
241
|
-
table.add_column("Description", style="
|
|
241
|
+
table.add_column("Description", style="", width=45)
|
|
242
242
|
|
|
243
243
|
service_descriptions = {
|
|
244
244
|
"kuzu-memory": "Graph-based memory system for agents",
|
|
@@ -261,17 +261,17 @@ class StartupManager:
|
|
|
261
261
|
self.console.print(" Enter service IDs to toggle (e.g., '1,3' or '1-4')")
|
|
262
262
|
|
|
263
263
|
text_a = Text(" ")
|
|
264
|
-
text_a.append("[a]", style="
|
|
264
|
+
text_a.append("[a]", style="bold blue")
|
|
265
265
|
text_a.append(" Enable all")
|
|
266
266
|
self.console.print(text_a)
|
|
267
267
|
|
|
268
268
|
text_n = Text(" ")
|
|
269
|
-
text_n.append("[n]", style="
|
|
269
|
+
text_n.append("[n]", style="bold blue")
|
|
270
270
|
text_n.append(" Disable all")
|
|
271
271
|
self.console.print(text_n)
|
|
272
272
|
|
|
273
273
|
text_b = Text(" ")
|
|
274
|
-
text_b.append("[b]", style="
|
|
274
|
+
text_b.append("[b]", style="bold blue")
|
|
275
275
|
text_b.append(" Back to previous menu")
|
|
276
276
|
self.console.print(text_b)
|
|
277
277
|
|
|
@@ -324,9 +324,9 @@ class StartupManager:
|
|
|
324
324
|
# Display services with checkboxes
|
|
325
325
|
table = Table(box=ROUNDED, show_lines=True)
|
|
326
326
|
table.add_column("ID", style="dim", width=5)
|
|
327
|
-
table.add_column("Service", style="
|
|
327
|
+
table.add_column("Service", style="bold blue", width=25)
|
|
328
328
|
table.add_column("Status", width=15)
|
|
329
|
-
table.add_column("Description", style="
|
|
329
|
+
table.add_column("Description", style="", width=45)
|
|
330
330
|
|
|
331
331
|
for idx, (service, description) in enumerate(available_services, 1):
|
|
332
332
|
status = (
|
|
@@ -341,17 +341,17 @@ class StartupManager:
|
|
|
341
341
|
self.console.print(" Enter service IDs to toggle (e.g., '1,3' or '1-4')")
|
|
342
342
|
|
|
343
343
|
text_a = Text(" ")
|
|
344
|
-
text_a.append("[a]", style="
|
|
344
|
+
text_a.append("[a]", style="bold blue")
|
|
345
345
|
text_a.append(" Enable all")
|
|
346
346
|
self.console.print(text_a)
|
|
347
347
|
|
|
348
348
|
text_n = Text(" ")
|
|
349
|
-
text_n.append("[n]", style="
|
|
349
|
+
text_n.append("[n]", style="bold blue")
|
|
350
350
|
text_n.append(" Disable all")
|
|
351
351
|
self.console.print(text_n)
|
|
352
352
|
|
|
353
353
|
text_b = Text(" ")
|
|
354
|
-
text_b.append("[b]", style="
|
|
354
|
+
text_b.append("[b]", style="bold blue")
|
|
355
355
|
text_b.append(" Back to previous menu")
|
|
356
356
|
self.console.print(text_b)
|
|
357
357
|
|
|
@@ -406,9 +406,9 @@ class StartupManager:
|
|
|
406
406
|
# Display agents with checkboxes
|
|
407
407
|
table = Table(box=ROUNDED, show_lines=True)
|
|
408
408
|
table.add_column("ID", style="dim", width=5)
|
|
409
|
-
table.add_column("Agent", style="
|
|
409
|
+
table.add_column("Agent", style="bold blue", width=25)
|
|
410
410
|
table.add_column("Status", width=15)
|
|
411
|
-
table.add_column("Description", style="bold
|
|
411
|
+
table.add_column("Description", style="bold", width=45)
|
|
412
412
|
|
|
413
413
|
for idx, agent in enumerate(agents, 1):
|
|
414
414
|
# Agent is ENABLED if NOT in disabled list
|
|
@@ -191,43 +191,43 @@ class TemplateEditor:
|
|
|
191
191
|
self.console.print("[bold]Editing Options:[/bold]")
|
|
192
192
|
if not is_system:
|
|
193
193
|
text_1 = Text(" ")
|
|
194
|
-
text_1.append("[1]", style="
|
|
194
|
+
text_1.append("[1]", style="bold blue")
|
|
195
195
|
text_1.append(" Edit in external editor")
|
|
196
196
|
self.console.print(text_1)
|
|
197
197
|
|
|
198
198
|
text_2 = Text(" ")
|
|
199
|
-
text_2.append("[2]", style="
|
|
199
|
+
text_2.append("[2]", style="bold blue")
|
|
200
200
|
text_2.append(" Add/modify a field")
|
|
201
201
|
self.console.print(text_2)
|
|
202
202
|
|
|
203
203
|
text_3 = Text(" ")
|
|
204
|
-
text_3.append("[3]", style="
|
|
204
|
+
text_3.append("[3]", style="bold blue")
|
|
205
205
|
text_3.append(" Remove a field")
|
|
206
206
|
self.console.print(text_3)
|
|
207
207
|
|
|
208
208
|
text_4 = Text(" ")
|
|
209
|
-
text_4.append("[4]", style="
|
|
209
|
+
text_4.append("[4]", style="bold blue")
|
|
210
210
|
text_4.append(" Reset to defaults")
|
|
211
211
|
self.console.print(text_4)
|
|
212
212
|
else:
|
|
213
213
|
text_1 = Text(" ")
|
|
214
|
-
text_1.append("[1]", style="
|
|
214
|
+
text_1.append("[1]", style="bold blue")
|
|
215
215
|
text_1.append(" Create customized copy")
|
|
216
216
|
self.console.print(text_1)
|
|
217
217
|
|
|
218
218
|
text_2 = Text(" ")
|
|
219
|
-
text_2.append("[2]", style="
|
|
219
|
+
text_2.append("[2]", style="bold blue")
|
|
220
220
|
text_2.append(" View full template")
|
|
221
221
|
self.console.print(text_2)
|
|
222
222
|
|
|
223
223
|
text_b = Text(" ")
|
|
224
|
-
text_b.append("[b]", style="
|
|
224
|
+
text_b.append("[b]", style="bold blue")
|
|
225
225
|
text_b.append(" Back")
|
|
226
226
|
self.console.print(text_b)
|
|
227
227
|
|
|
228
228
|
self.console.print()
|
|
229
229
|
|
|
230
|
-
choice = Prompt.ask("[bold
|
|
230
|
+
choice = Prompt.ask("[bold blue]Select an option[/bold blue]", default="b")
|
|
231
231
|
|
|
232
232
|
if is_system:
|
|
233
233
|
if choice == "1":
|
|
@@ -10,9 +10,12 @@ from .agent_wizard import (
|
|
|
10
10
|
run_interactive_agent_manager,
|
|
11
11
|
run_interactive_agent_wizard,
|
|
12
12
|
)
|
|
13
|
+
from .skills_wizard import SkillsWizard, discover_and_link_runtime_skills
|
|
13
14
|
|
|
14
15
|
__all__ = [
|
|
15
16
|
"AgentWizard",
|
|
17
|
+
"SkillsWizard",
|
|
18
|
+
"discover_and_link_runtime_skills",
|
|
16
19
|
"run_interactive_agent_manager",
|
|
17
20
|
"run_interactive_agent_wizard",
|
|
18
21
|
]
|