@@ -94,6 +94,37 @@ def get_available_presets(self) -> list[str]:
9494
9595 return sorted (presets )
9696
97+ def get_presets_with_source (self ) -> list [tuple [str , str ]]:
98+ """Get list of available presets with their source location.
99+
100+ Returns:
101+ list[tuple[str, str]]: List of (preset_name, source) tuples where
102+ source is either "user" or "builtin"
103+ """
104+ user_presets : set [str ] = set ()
105+ builtin_presets : set [str ] = set ()
106+
107+ # Get presets from user config directory
108+ if self .presets_dir .exists ():
109+ for file in self .presets_dir .glob ("*.json" ):
110+ user_presets .add (file .stem )
111+
112+ # Get default presets from package
113+ if self .default_presets_dir .exists ():
114+ for file in self .default_presets_dir .glob ("*.json" ):
115+ builtin_presets .add (file .stem )
116+
117+ result = []
118+ all_presets = sorted (user_presets | builtin_presets )
119+ for preset in all_presets :
120+ # User presets take precedence
121+ if preset in user_presets :
122+ result .append ((preset , "user" ))
123+ else :
124+ result .append ((preset , "builtin" ))
125+
126+ return result
127+
97128 def load_preset (self , preset_name : str ) -> dict [str , Any ]:
98129 """Load a preset file by name.
99130
0 commit comments