Manages MCP CLI preferences with file persistence.
| 186 | |
| 187 | |
| 188 | class PreferenceManager: |
| 189 | """Manages MCP CLI preferences with file persistence.""" |
| 190 | |
| 191 | def __init__(self, config_dir: Path | None = None): |
| 192 | """Initialize preference manager. |
| 193 | |
| 194 | Args: |
| 195 | config_dir: Optional custom config directory, defaults to ~/.mcp-cli |
| 196 | """ |
| 197 | self.config_dir = config_dir or Path(DEFAULT_CONFIG_DIR).expanduser() |
| 198 | self.config_dir.mkdir(parents=True, exist_ok=True) |
| 199 | self.preferences_file = self.config_dir / "preferences.json" |
| 200 | self.preferences = self.load_preferences() |
| 201 | |
| 202 | def load_preferences(self) -> MCPPreferences: |
| 203 | """Load preferences from file or create defaults.""" |
| 204 | if self.preferences_file.exists(): |
| 205 | try: |
| 206 | with open(self.preferences_file, "r") as f: |
| 207 | data = json.load(f) |
| 208 | return MCPPreferences.from_dict(data) |
| 209 | except (json.JSONDecodeError, KeyError, ValueError): |
| 210 | # If preferences are corrupted or invalid, backup and create new |
| 211 | backup_file = self.preferences_file.with_suffix(".json.backup") |
| 212 | self.preferences_file.rename(backup_file) |
| 213 | return MCPPreferences() |
| 214 | return MCPPreferences() |
| 215 | |
| 216 | def save_preferences(self) -> None: |
| 217 | """Save preferences to file.""" |
| 218 | with open(self.preferences_file, "w") as f: |
| 219 | json.dump(self.preferences.to_dict(), f, indent=2) |
| 220 | |
| 221 | def get_theme(self) -> str: |
| 222 | """Get current theme.""" |
| 223 | return self.preferences.ui.theme |
| 224 | |
| 225 | def set_theme(self, theme: str) -> None: |
| 226 | """Set and persist theme. |
| 227 | |
| 228 | Args: |
| 229 | theme: Theme name to set |
| 230 | |
| 231 | Raises: |
| 232 | ValueError: If theme is not valid |
| 233 | """ |
| 234 | try: |
| 235 | theme_enum = Theme(theme) |
| 236 | except ValueError: |
| 237 | valid_themes = [t.value for t in Theme] |
| 238 | raise ValueError( |
| 239 | f"Invalid theme: {theme}. Valid themes are: {', '.join(valid_themes)}" |
| 240 | ) |
| 241 | |
| 242 | self.preferences.ui.theme = theme_enum |
| 243 | self.save_preferences() |
| 244 | |
| 245 | def get_verbose(self) -> bool: |
no outgoing calls