2323
2424logger = logging .getLogger (__name__ )
2525
26- # Default skill repositories (similar to cc-switch)
27- DEFAULT_SKILL_REPOS = [
28- {
29- "owner" : "anthropics" ,
30- "name" : "skills" ,
31- "branch" : "main" ,
32- "enabled" : True ,
33- "skillsPath" : None ,
34- },
35- {
36- "owner" : "ComposioHQ" ,
37- "name" : "awesome-claude-skills" ,
38- "branch" : "main" ,
39- "enabled" : True ,
40- "skillsPath" : None ,
41- },
42- ]
26+
27+ def _load_builtin_skill_repos () -> List [Dict ]:
28+ """Load built-in skill repos from the bundled skill_repos.json file."""
29+ # Look for skill_repos.json in the package directory
30+ package_dir = Path (__file__ ).parent
31+ repos_file = package_dir / "skill_repos.json"
32+
33+ if repos_file .exists ():
34+ try :
35+ with open (repos_file , "r" , encoding = "utf-8" ) as f :
36+ repos_data = json .load (f )
37+ # Convert from dict format to list format
38+ return [
39+ {
40+ "owner" : repo .get ("owner" ),
41+ "name" : repo .get ("name" ),
42+ "branch" : repo .get ("branch" , "main" ),
43+ "enabled" : repo .get ("enabled" , True ),
44+ "skillsPath" : repo .get ("skillsPath" ),
45+ }
46+ for repo in repos_data .values ()
47+ ]
48+ except Exception as e :
49+ logger .warning (f"Failed to load builtin skill repos: { e } " )
50+
51+ # Fallback defaults if file not found
52+ return [
53+ {
54+ "owner" : "ComposioHQ" ,
55+ "name" : "awesome-claude-skills" ,
56+ "branch" : "main" ,
57+ "enabled" : True ,
58+ "skillsPath" : None ,
59+ },
60+ {
61+ "owner" : "obra" ,
62+ "name" : "superpowers" ,
63+ "branch" : "main" ,
64+ "enabled" : True ,
65+ "skillsPath" : "skills" ,
66+ },
67+ ]
68+
69+
70+ # Default skill repositories loaded from bundled file
71+ DEFAULT_SKILL_REPOS = _load_builtin_skill_repos ()
4372
4473# Skill install directories for each app type
4574SKILL_INSTALL_DIRS = {
@@ -195,9 +224,10 @@ def _save_skills(self, skills: Dict[str, Skill]) -> None:
195224 raise
196225
197226 def _load_repos (self ) -> Dict [str , SkillRepo ]:
198- """Load skill repos from file."""
227+ """Load skill repos from file. Initializes with defaults if file doesn't exist. """
199228 if not self .repos_file .exists ():
200- return {}
229+ # Initialize with default repos on first use
230+ self ._init_default_repos_file ()
201231
202232 try :
203233 with open (self .repos_file , "r" ) as f :
@@ -210,6 +240,23 @@ def _load_repos(self) -> Dict[str, SkillRepo]:
210240 logger .warning (f"Failed to load skill repos: { e } " )
211241 return {}
212242
243+ def _init_default_repos_file (self ) -> None :
244+ """Initialize the repos file with default skill repos."""
245+ repos = {}
246+ for repo_data in DEFAULT_SKILL_REPOS :
247+ repo = SkillRepo (
248+ owner = repo_data ["owner" ],
249+ name = repo_data ["name" ],
250+ branch = repo_data .get ("branch" , "main" ),
251+ enabled = repo_data .get ("enabled" , True ),
252+ skills_path = repo_data .get ("skillsPath" ),
253+ )
254+ repo_id = f"{ repo .owner } /{ repo .name } "
255+ repos [repo_id ] = repo
256+
257+ self ._save_repos (repos )
258+ logger .info (f"Initialized { len (repos )} default skill repos" )
259+
213260 def _save_repos (self , repos : Dict [str , SkillRepo ]) -> None :
214261 """Save skill repos to file."""
215262 try :
0 commit comments