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.

Files changed (77) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/templates/agentic-coder-optimizer.json +9 -2
  3. claude_mpm/agents/templates/api_qa.json +7 -1
  4. claude_mpm/agents/templates/clerk-ops.json +8 -1
  5. claude_mpm/agents/templates/code_analyzer.json +4 -1
  6. claude_mpm/agents/templates/dart_engineer.json +11 -1
  7. claude_mpm/agents/templates/data_engineer.json +11 -1
  8. claude_mpm/agents/templates/documentation.json +6 -1
  9. claude_mpm/agents/templates/engineer.json +13 -0
  10. claude_mpm/agents/templates/gcp_ops_agent.json +8 -1
  11. claude_mpm/agents/templates/golang_engineer.json +11 -1
  12. claude_mpm/agents/templates/java_engineer.json +12 -2
  13. claude_mpm/agents/templates/local_ops_agent.json +216 -37
  14. claude_mpm/agents/templates/nextjs_engineer.json +11 -1
  15. claude_mpm/agents/templates/ops.json +8 -1
  16. claude_mpm/agents/templates/php-engineer.json +11 -1
  17. claude_mpm/agents/templates/project_organizer.json +9 -2
  18. claude_mpm/agents/templates/prompt-engineer.json +5 -1
  19. claude_mpm/agents/templates/python_engineer.json +11 -1
  20. claude_mpm/agents/templates/qa.json +7 -1
  21. claude_mpm/agents/templates/react_engineer.json +11 -1
  22. claude_mpm/agents/templates/refactoring_engineer.json +8 -1
  23. claude_mpm/agents/templates/research.json +4 -1
  24. claude_mpm/agents/templates/ruby-engineer.json +11 -1
  25. claude_mpm/agents/templates/rust_engineer.json +11 -1
  26. claude_mpm/agents/templates/security.json +6 -1
  27. claude_mpm/agents/templates/ticketing.json +6 -1
  28. claude_mpm/agents/templates/typescript_engineer.json +11 -1
  29. claude_mpm/agents/templates/vercel_ops_agent.json +8 -1
  30. claude_mpm/agents/templates/version_control.json +8 -1
  31. claude_mpm/agents/templates/web_qa.json +7 -1
  32. claude_mpm/agents/templates/web_ui.json +11 -1
  33. claude_mpm/cli/commands/configure.py +164 -16
  34. claude_mpm/cli/commands/configure_agent_display.py +6 -6
  35. claude_mpm/cli/commands/configure_behavior_manager.py +8 -8
  36. claude_mpm/cli/commands/configure_navigation.py +20 -18
  37. claude_mpm/cli/commands/configure_startup_manager.py +14 -14
  38. claude_mpm/cli/commands/configure_template_editor.py +8 -8
  39. claude_mpm/cli/interactive/__init__.py +3 -0
  40. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  41. claude_mpm/cli/startup.py +26 -0
  42. claude_mpm/dashboard/static/js/dashboard.js +0 -14
  43. claude_mpm/dashboard/templates/index.html +3 -41
  44. claude_mpm/services/socketio/handlers/__init__.py +5 -2
  45. claude_mpm/services/socketio/handlers/hook.py +10 -0
  46. claude_mpm/services/socketio/handlers/registry.py +4 -2
  47. claude_mpm/services/socketio/server/main.py +7 -7
  48. claude_mpm/skills/__init__.py +21 -0
  49. claude_mpm/skills/bundled/__init__.py +6 -0
  50. claude_mpm/skills/registry.py +198 -0
  51. claude_mpm/skills/skill_manager.py +310 -0
  52. {claude_mpm-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/METADATA +1 -1
  53. {claude_mpm-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/RECORD +57 -72
  54. claude_mpm/dashboard/static/css/code-tree.css +0 -1639
  55. claude_mpm/dashboard/static/js/components/code-tree/tree-breadcrumb.js +0 -353
  56. claude_mpm/dashboard/static/js/components/code-tree/tree-constants.js +0 -235
  57. claude_mpm/dashboard/static/js/components/code-tree/tree-search.js +0 -409
  58. claude_mpm/dashboard/static/js/components/code-tree/tree-utils.js +0 -435
  59. claude_mpm/dashboard/static/js/components/code-tree.js +0 -5869
  60. claude_mpm/dashboard/static/js/components/code-viewer.js +0 -1386
  61. claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  62. claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
  63. claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
  64. claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-313.pyc +0 -0
  65. claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
  66. claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
  67. claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
  68. claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
  69. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager.cpython-313.pyc +0 -0
  70. claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
  71. claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
  72. claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
  73. claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
  74. {claude_mpm-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/WHEEL +0 -0
  75. {claude_mpm-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/entry_points.txt +0 -0
  76. {claude_mpm-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/licenses/LICENSE +0 -0
  77. {claude_mpm-4.15.3.dist-info → claude_mpm-4.15.6.dist-info}/top_level.txt +0 -0
@@ -146,5 +146,12 @@
146
146
  "git"
147
147
  ],
148
148
  "optional": false
149
- }
149
+ },
150
+ "skills": [
151
+ "docker-containerization",
152
+ "database-migration",
153
+ "security-scanning",
154
+ "git-workflow",
155
+ "systematic-debugging"
156
+ ]
150
157
  }
@@ -389,5 +389,11 @@
389
389
  ],
390
390
  "priority": 90,
391
391
  "retention": "session"
392
- }
392
+ },
393
+ "skills": [
394
+ "test-driven-development",
395
+ "systematic-debugging",
396
+ "async-testing",
397
+ "performance-profiling"
398
+ ]
393
399
  }
@@ -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._edit_templates()
214
+ self._manage_skills()
215
215
  elif choice == "3":
216
- self._manage_behaviors()
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="cyan bold")
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="cyan bold")
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="cyan bold")
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="cyan bold")
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="cyan bold")
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 cyan]Select an option[/bold cyan]", default="b")
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="cyan bold")
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="cyan bold")
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="cyan bold")
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 bold")
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="yellow bold")
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 cyan]Select an option[/bold cyan]", default="s")
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="cyan", width=22)
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 cyan", width=45)
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="cyan", width=5)
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 cyan", width=45)
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="cyan",
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="cyan",
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="cyan bold")
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="cyan bold")
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="cyan bold")
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="cyan bold")
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="cyan bold")
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 cyan]Select an option[/bold cyan]", default="b")
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="cyan", width=30)
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="white", width=20)
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 cyan")
63
- header_text.append("Configuration Interface", style="bold white")
64
- header_text.append(f"\nv{__version__}", style="dim cyan")
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="yellow")
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. Template Editing
89
- 3. Behavior Files
90
- 4. Startup Configuration
91
- 5. Switch Scope
92
- 6. Version Info
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", "Template Editing", "Edit agent JSON templates"),
102
- ("3", "Behavior Files", "Manage identity and workflow configurations"),
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
- "4",
106
+ "5",
105
107
  "Startup Configuration",
106
108
  "Configure MCP services and agents to start",
107
109
  ),
108
- ("5", "Switch Scope", f"Current: {self.current_scope}"),
109
- ("6", "Version Info", "Display MPM and Claude versions"),
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="cyan bold", width=4) # Bolder shortcuts
116
- table.add_column("Option", style="bold white", width=24) # Wider for titles
117
- table.add_column("Description", style="white") # Better contrast
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 cyan]Select an option[/bold cyan]", default="q")
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="cyan", width=20)
182
- table.add_column("Enabled Services", style="white", width=50)
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="cyan", width=25)
239
+ table.add_column("Service", style="bold blue", width=25)
240
240
  table.add_column("Status", width=15)
241
- table.add_column("Description", style="white", width=45)
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="cyan bold")
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="cyan bold")
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="cyan bold")
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="cyan", width=25)
327
+ table.add_column("Service", style="bold blue", width=25)
328
328
  table.add_column("Status", width=15)
329
- table.add_column("Description", style="white", width=45)
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="cyan bold")
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="cyan bold")
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="cyan bold")
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="cyan", width=25)
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 cyan", width=45)
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="cyan bold")
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="cyan bold")
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="cyan bold")
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="cyan bold")
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="cyan bold")
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="cyan bold")
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="cyan bold")
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 cyan]Select an option[/bold cyan]", default="b")
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
  ]